并行处理—在未知的flink流中强制实现良好平衡的并行

new9mtju  于 2021-06-21  发布在  Flink
关注(0)|答案(1)|浏览(430)

基于我对flink的理解,它引入了基于键(keygroups)的并行性。然而,假设一个人有一个巨大的无眼流,并希望工作是平行进行,什么是最好的方式来实现这一点?
如果流有一些字段,人们可能会考虑通过其中一个字段任意设置键控,但是这并不能保证工作负载将得到适当的平衡。例如,因为该字段中的一个值可能出现在90%的消息中。因此我的问题是:

如何在flink中执行良好平衡的并行性,而不必事先知道流中有什么

我能想到的一个可能的解决方案是为每条消息分配一个随机数(如果您希望并行度为3,可以说是1-3;如果您希望并行度更灵活,可以说是1-1000)。然而,我想知道这是否是推荐的方法,因为它感觉不太优雅。

z2acfund

z2acfund1#

keyBy 是指定流分区的一种方法,它特别有用,因为可以保证具有相同键的所有流元素都将一起处理。这是使用flink进行有状态流处理的基础。
但是,如果您不需要使用键分区状态,而是关心如何确保分区的平衡,那么可以使用 shuffle() 或者 rebalance() 使随机或循环分区。详见文档。如果需要更显式的控制,还可以实现自定义分区器。
顺便说一句,如果你真的想用一个随机数为流设置密钥,不要做类似的事情 keyBy(new Random.nextInt(n)) . 键选择器必须是确定性的。这是必要的,因为键不随流记录一起移动——相反,键选择器函数用于在需要时计算键。因此,对于随机键控,将另一个字段添加到事件中,并用随机数填充它,然后将其用作键。当您想要使用键控状态或计时器,但没有任何适合用作键的内容时,此技术非常有用。

相关问题