在 SPARK 中,为什么 Narrow Dependency 严格不需要 schuffle over the network?
In SPARK, why Narrow Dependency strictly doesn't require schuffle over the network?
我正在阅读关于 Narrow Vs Wide dependencies 跨多个分区的 RDD。
我的问题:我不明白为什么使用窄依赖关系构建的 RDD 不需要通过网络进行随机播放?还是洗牌确实发生了,但只发生了几次?
请参考下图-
假设子 RDD 是使用父 RDD 的窄依赖创建的,如下面的红色矩形所示。现在,父 RDD 有 3 个分区,比方说(P1、P2、P3),每个分区中的数据被映射到其他 3 个分区,比方说(P1、P4、P5)。
因为父 RDD 分区 P1 中的数据被映射到自身,所以网络上没有 shuffle。但是由于来自父 RDD 分区 P2 和 P3 的数据被映射到子 RDD 分区 P4 和 P5,它们是不同的分区,所以自然地数据必须通过网络才能将相应的值放在 P4 和 P5 中。那么,为什么说网络上没有shuffle呢?
见绿色方框,这个情况更复杂。只有当父 RDD 分区映射到自身时,我才能看到网络上没有随机播放的情况。
我确定我的推理是错误的。有人可以提供一些解释吗?
谢谢
窄依赖并不意味着没有网络流量。
窄宽的区别更微妙:
- 具有广泛的依赖性,每个子分区都依赖于其父分区的每个分区。是多对多的关系。
- 在窄依赖的情况下,每个子分区最多依赖于每个父分区的一个分区。可以是一对一关系,也可以是多对一关系。
是否需要网络流量取决于其他因素,而不仅仅是转换。例如,如果在同一操作期间发生洗牌(在这种情况下,同时存在共同分区和协同定位),则可以在没有网络流量的情况下加入共同分区的 RDD,否则可以使用网络流量。
根据您提供的link:
A typical execution sequence is as follows ... RDD is created originally from external data sources (e.g. HDFS, Local file ... etc) RDD undergoes a sequence of TRANSFORMATION (e.g. map, flatMap, filter, groupBy, join), each provide a different RDD that feed into the next transformation. Finally the last step is an ACTION (e.g. count, collect, save, take), which convert the last RDD into an output to external data sources The above sequence of processing is called a lineage (outcome of the topological sort of the DAG)
现在想想数据在通过管道时是如何处理的。
如果存在窄依赖,则子分区只依赖1个父分区。父分区的数据可以在一台机器上处理,然后子分区可以存在于同一台机器上。无需改组数据。
如果存在宽依赖,则1个子分区依赖于多个父分区。父分区可能存在于多台机器上,因此必须通过网络对数据进行shuffle才能完成数据处理。
我打个分区的比喻。
如果你有一组文档,想对它进行过滤,找出所有填写不当的文档,就相当于做了一个过滤操作。为了加快操作速度,你把这组文件分给了三个人,每人有一个文件的分区。然后每个人筛选给他们的文档子集(在输入框中),并将未正确填写的文档放入输出框。
每个人执行的操作使得输出框的内容仅取决于提供给他们的输入框;其他人的输入框与输出无关。因此不需要网络传输。
希望这能解释清楚。
我正在阅读关于 Narrow Vs Wide dependencies 跨多个分区的 RDD。
我的问题:我不明白为什么使用窄依赖关系构建的 RDD 不需要通过网络进行随机播放?还是洗牌确实发生了,但只发生了几次?
请参考下图-
假设子 RDD 是使用父 RDD 的窄依赖创建的,如下面的红色矩形所示。现在,父 RDD 有 3 个分区,比方说(P1、P2、P3),每个分区中的数据被映射到其他 3 个分区,比方说(P1、P4、P5)。
因为父 RDD 分区 P1 中的数据被映射到自身,所以网络上没有 shuffle。但是由于来自父 RDD 分区 P2 和 P3 的数据被映射到子 RDD 分区 P4 和 P5,它们是不同的分区,所以自然地数据必须通过网络才能将相应的值放在 P4 和 P5 中。那么,为什么说网络上没有shuffle呢?
见绿色方框,这个情况更复杂。只有当父 RDD 分区映射到自身时,我才能看到网络上没有随机播放的情况。
我确定我的推理是错误的。有人可以提供一些解释吗? 谢谢
窄依赖并不意味着没有网络流量。
窄宽的区别更微妙:
- 具有广泛的依赖性,每个子分区都依赖于其父分区的每个分区。是多对多的关系。
- 在窄依赖的情况下,每个子分区最多依赖于每个父分区的一个分区。可以是一对一关系,也可以是多对一关系。
是否需要网络流量取决于其他因素,而不仅仅是转换。例如,如果在同一操作期间发生洗牌(在这种情况下,同时存在共同分区和协同定位),则可以在没有网络流量的情况下加入共同分区的 RDD,否则可以使用网络流量。
根据您提供的link:
A typical execution sequence is as follows ... RDD is created originally from external data sources (e.g. HDFS, Local file ... etc) RDD undergoes a sequence of TRANSFORMATION (e.g. map, flatMap, filter, groupBy, join), each provide a different RDD that feed into the next transformation. Finally the last step is an ACTION (e.g. count, collect, save, take), which convert the last RDD into an output to external data sources The above sequence of processing is called a lineage (outcome of the topological sort of the DAG)
现在想想数据在通过管道时是如何处理的。
如果存在窄依赖,则子分区只依赖1个父分区。父分区的数据可以在一台机器上处理,然后子分区可以存在于同一台机器上。无需改组数据。
如果存在宽依赖,则1个子分区依赖于多个父分区。父分区可能存在于多台机器上,因此必须通过网络对数据进行shuffle才能完成数据处理。
我打个分区的比喻。 如果你有一组文档,想对它进行过滤,找出所有填写不当的文档,就相当于做了一个过滤操作。为了加快操作速度,你把这组文件分给了三个人,每人有一个文件的分区。然后每个人筛选给他们的文档子集(在输入框中),并将未正确填写的文档放入输出框。 每个人执行的操作使得输出框的内容仅取决于提供给他们的输入框;其他人的输入框与输出无关。因此不需要网络传输。
希望这能解释清楚。