Apache Flink中shuffle()和rebalance()之间的区别

fro*_*tin 5 apache partitioning bigdata apache-flink flink-streaming

我正在研究我的学士学位的最终项目,这是关于Apache Spark Streaming和Apache Flink(仅限流媒体)之间的比较,我刚刚在Flink的文档中找到了"物理分区".问题是,在本文档中,它并没有很好地解释这两个转换是如何工作的.直接来自文档:

shuffle():根据均匀分布随机分区元素.

rebalance():分区元素循环,每个分区创建相等的负载.在存在数据偏斜时用于性能优化.

资料来源:https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/datastream_api.html#physical-partitioning

两者都是自动完成的,所以我理解的是它们都是shuffle()均匀地重新分配(>均匀分布和rebalance()>循环)以及随机数据.然后我推断出rebalance()以更好的方式分配数据("每个分区的负载相等"),因此任务必须处理相同数量的数据,但shuffle()可能会创建越来越大的分区.于是,在这种情况下,可能你更喜欢使用shuffle()rebalance()

我想到的唯一事情是可能rebalance()需要一些处理时间,因此在某些情况下,它可能会花费更多时间来进行重新平衡,而不是在未来转换中改进的时间.

我一直在寻找这个,没有人谈过这个,只在Flink的邮件列表中,但他们没有解释如何shuffle()工作.

感谢Sneftel,他帮助我改进了我的问题,问我要让我重新思考一下我想问的问题; 和Till谁回答我的问题.:d

Til*_*ann 10

正如文档所述,shuffle将随机分发数据,而rebalance将以循环方式分发数据.后者更有效,因为您不必计算随机数.而且,根据随机性,你最终可能会得到某种不那么均匀的分布.

另一方面,rebalance将始终开始将第一个元素发送到第一个通道.因此,如果您只有少量元素(比子任务更少的元素),那么只有一些子任务将接收元素,因为您总是开始将第一个元素发送到第一个子任务.在流式传输的情况下,这最终无关紧要,因为你通常有一个无界的输入流.

两种方法存在的实际原因是历史原因.shuffle首先介绍.为了使批处理流API更加相似,rebalance然后介绍了.