【发布时间】:2018-10-14 03:13:03
【问题描述】:
我正在阅读关于跨多个分区的 RDD 的 Narrow Vs Wide dependencies。
我的问题:我不明白为什么用 Narrow Dependencies 构建的 RDD 不需要通过网络进行混洗?还是 shuffle 确实发生了,但只发生了几次?
假设一个子 RDD 是从父 RDD 创建的,具有 Narrow Dependency,如下面的红色矩形所示。现在,父 RDD 有 3 个分区,比方说 (P1,P2,P3),每个分区中的数据被映射到分别映射到 3 个其他分区,比方说 (P1,P4,P5)。
由于父 RDD 分区 P1 中的数据被映射到自身,因此网络上没有 shuffle。但是由于来自父 RDD 分区 P2 和 P3 的数据被映射到子 RDD 分区 P4 和 P5,它们是不同的分区,所以数据自然必须通过网络在 P4 和 P5 中放置相应的值。因此,为什么我们说网络上没有洗牌?
见绿色方框,这是更复杂的情况。只有当父 RDD 分区映射到自身时,我才能看到网络上没有随机播放的情况。
我确信我的推理是不正确的。有人可以提供一些解释吗? 谢谢
【问题讨论】:
-
我的理解有缺陷。发生的情况是,当我们在 RDD 上应用 map() 函数时,分区不会改变。最多,分区器/散列将被破坏。因此,跨 3 个分区 (P1,P2,P3) 的父 RDD 将导致子 RDD 分别精确地分布在 (P1,P2,P3) 上,每个分区数据使用 map(function) 一对一映射。因此,上面的红框中不会有洗牌。
-
在绿框中,由于两个父RDD具有相同的分区器(它们是共同分区的),因此具有相同键的数据将位于同一分区上,因此不涉及洗牌。因此,只有 join() 操作会导致窄依赖,其中两个 RDD 都使用相同的分区器进行分区,否则 join() 操作将导致宽依赖,这意味着跨网络的数据混洗。
-
注意:在上面的绿色框中。不是 6 个分区,而是 3 个,因为输入的 RDD 是共同分区的,即;使用相同的分区器进行分区,从而导致具有相同键的元素以相同的分区索引结尾。如果 RDD1 放置在 (P1,P2,P3) 上,则 RDD2 也同样放置在 (P1,P2,P3) 上。仅仅因为有 6 个盒子并不意味着 6 个分区;)
标签: apache-spark networking dependencies rdd partitioning