我有自己的分区技术,可为DataStream元组生成键,这些键的范围等于集群中节点的数量,例如,如果将并行度设置为4,则生成的键将为0、1,2和3依此类推,然后应将每个密钥分区到同一节点,以使用键控状态进行更多的键控处理。
发生了什么:我已经使用keyBy实现了我的逻辑,因此我可以使用键控状态,但是它存在很大的偏斜,有些节点没有收到记录,而其他节点则收到了多个记录。我尝试使用自定义分区,它按我的意愿进行了物理分区,但是如果不使用keyBy,我将无法使用键控状态。
是否有一种方法可以控制偏斜度或强制将密钥在可用节点上并行化?或是否有办法覆盖keyBy中使用的分区技术?或是否可以通过自定义分区使用键控状态?
答案 0 :(得分:2)
据我所知,对于这样的键空间大小(大致)等于并行度的情况,没有一个干净的解决方案。一种行之有效的方法是编写自己的KeySelector
函数,并让它为每个分区计算密钥,以使这些密钥属于分配给不同工作人员的密钥组,但要弄清楚如何要做到这一点并不容易。
已经有关于进行此on the user mailing list的讨论。