Parallel processing 在无眼弗林克流中实现良好平衡的并行性

Parallel processing 在无眼弗林克流中实现良好平衡的并行性,parallel-processing,apache-flink,flink-streaming,Parallel Processing,Apache Flink,Flink Streaming,根据我对Flink的理解,它介绍了基于键(键组)的并行性。然而,假设一个人有一个巨大的无眼流,并且希望并行地完成工作,那么实现这一点的最佳方法是什么 如果流有一些字段,您可能会考虑通过其中一个字段任意设置密钥,但是这并不保证工作负载将得到适当平衡。例如,因为该字段中的一个值可能出现在90%的消息中。因此,我的问题是: 如何在Flink中执行平衡良好的并行性,而不事先知道流中有什么 我能想到的一个可能的解决方案是为每条消息分配一个随机数(如果希望并行度为3,则为1-3;如果希望并行度更灵活,则为

根据我对Flink的理解,它介绍了基于键(键组)的并行性。然而,假设一个人有一个巨大的无眼流,并且希望并行地完成工作,那么实现这一点的最佳方法是什么

如果流有一些字段,您可能会考虑通过其中一个字段任意设置密钥,但是这并不保证工作负载将得到适当平衡。例如,因为该字段中的一个值可能出现在90%的消息中。因此,我的问题是:

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

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

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

但是,如果您不需要使用键分区状态,而是关心如何确保分区平衡,那么可以使用
shuffle()
rebalance()
进行随机或循环分区。有关更多详细信息,请参阅。如果需要更明确的控制,还可以实现自定义分区器


顺便说一句,如果您确实希望按随机数为流设置关键帧,不要执行类似于
keyBy(new random.nextInt(n))
的操作。键选择器必须是确定性的。这是必要的,因为键不随流记录一起移动——相反,键选择器函数用于在需要时计算键。因此,对于随机键控,将另一个字段添加到事件中,并使用随机数填充它,然后将其用作键。当您想要使用键控状态或计时器,但没有任何适合用作键的工具时,此技术非常有用。

谢谢,这看起来更优雅。正如您提到的state:我知道这将适用于无状态操作,但是如果在洗牌之后完成了statefull操作,会发生什么呢?它会自动切换回1(我认为spark会这样做),或者每个并行流保留1个结果,或者可能会阻止/失败此类操作?Flint支持在并行、非键控上下文中使用托管、检查点状态,但接口不同。谢谢!请注意,当前[flink streaming]的定义与[apache flink]相同。考虑到这一点,我建议将其视为同义词:谢谢你的提醒。重写[flink streaming]的定义以排除批处理可能更有意义。我会给出这样的想法。如果我们考虑批处理一个特殊的流式传输,这可能是不必要的。也许每个API都有一个标记,并将批处理作为Dataset API的同义词是有意义的?