根据我对Flink的理解,介绍了基于键(键组)的并行性。然而,假设一个人有一条巨大的没有钥匙的小溪,并且希望并行地完成这项工作,那么实现这一目标的最佳方法是什么?
如果流中有一些字段,您可能会考虑按某个字段按键,但是这并不保证工作负载将得到适当的平衡。例如,因为该字段中的一个值可能发生在90%的消息中。因此,我的问题是:
如何在Flink中执行良好平衡的并行性,而无需事先了解流中的内容
我可以想到的一个潜在的解决方案是为每条消息分配一个随机数(如果您想要并行性为3,或者如果您希望并行性更灵活,则为1-1000 )。但是,我想知道这是否是推荐的方法,因为它感觉不太优雅。
发布于 2020-06-28 09:52:53
keyBy是指定流分区的一种方法,它特别有用,因为您可以保证所有具有相同密钥的流元素都将一起处理。这是Flink处理有状态流的基础。
但是,如果您不需要使用键分区状态,而是关心确保分区是良好平衡的,则可以使用shuffle()或rebalance()来导致随机分区或循环分区。有关更多细节,请参见文档。如果您想要更显式的控制,也可以实现自定义分区器。
顺便说一句,如果您确实想用随机数来键入流,就不会做类似于keyBy(new Random.nextInt(n))的事情。关键选择器必须是确定性的。这是必要的,因为键不与流记录一起运行--相反,键选择器函数用于在需要时计算密钥。因此,对于随机键控,将另一个字段添加到您的事件中,并使用一个随机数填充它,并使用它作为键。当您想要使用键控状态或定时器时,这种技术很有用,但是没有任何适合用作键的东西。
https://stackoverflow.com/questions/62620646
复制相似问题