我正在撰写我的学士学位论文,主题是比较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(): 轮询方式对元素进行分区,创建每个分区的平等负载。在存在数据倾斜的情况下,有助于性能优化。
来源: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()
的工作原理。
rebalance()
更有效率呢?它们只是不同的方法。shuffle()
是一种随机负载平衡方法,而rebalance()
则是一种显式的贪心方法。 - Sneftelshuffle()
方法以随机和均匀的方式分配元素,因此可能不会创建相同的负载分区,而rebalance()
方法则尝试创建所有具有相同负载的分区。然后我推断出,rebalance()
方法以更高效的方式进行工作分配,因为所有任务管理器将处理大致相同的数据。那么如果rebalance()
方法可以更好地完成同样的工作,为什么还要使用shuffle()
方法呢?在某些情况下,rebalance()
所需的处理可能会产生比它可以改进的更多的延迟吗?谢谢 :) - froblesmartin