在无密钥的 Flink 流中实施良好平衡的并行性

Den*_*din 2 parallel-processing apache-flink flink-streaming

根据我对Flink的理解,它引入了基于键(键组)的并行性。然而,假设一个人有大量未加密的流并且希望并行完成工作,那么实现这一目标的最佳方法是什么?

如果流有一些字段,人们可能会考虑任意地使用其中一个字段进行键控,但这并不能保证工作负载能够正确平衡。例如,因为该字段中的一个值可能出现在 90% 的消息中。因此我的问题是:

如何在不事先了解流中内容的情况下在 Flink 中实施良好平衡的并行性


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

Dav*_*son 6

keyBy是指定流分区的一种方法,它特别有用,因为可以保证具有相同键的所有流元素将被一起处理。这是 Flink 有状态流处理的基础。

但是,如果您不需要使用键分区状态,而是关心确保分区良好平衡,则可以使用shuffle()rebalance()来引发随机或循环分区。请参阅文档了解更多详细信息。如果您想要更明确的控制,您还可以实现自定义分区器。

顺便说一句,如果您确实想通过随机数对流进行加密,请不要执行类似的操作keyBy(new Random.nextInt(n))。键选择器必须具有确定性。这是必要的,因为键不随流记录一起传输——相反,键选择器函数用于在需要时计算键。因此,对于随机键控,请向事件添加另一个字段并用随机数填充它,然后使用它作为键。当您想要使用键控状态或计时器,但没有任何适合用作键的东西时,此技术非常有用。