Spark中的宽依赖和窄依赖

1.宽依赖和窄依赖的原理

http://shiyanjun.cn/archives/744.html

 

窄依赖的原理:是指父RDD的分区只被子RDD的一个分区使用。

  特点:

1窄依赖允许在一个集群节点上以流水线的方式(pipeline)计算所有父分区。例如,逐个元素地执行map、然后filter操作

2窄依赖能够更有效地进行失效节点的恢复,即只需重新计算丢失RDD分区的父分区,而且不同节点之间可以并行计算


宽依赖的原理:是指父RDD的分区被子RDD的多个分区使用【wide dependencies):子RDD的每个分区依赖于所有父RDD分区。】

  特点:

(1)宽依赖则需要首先计算好所有父分区数据,然后在节点之间进行Shuffle,这与MapReduce类似

(2)对于一个宽依赖关系的Lineage图,单个节点失效可能导致这个RDD的所有祖先丢失部分分区,因而需要整体重新计算。


例如,map产生窄依赖,而join则是宽依赖(除非父RDD被哈希分区)。见下图:

Spark中的宽依赖和窄依赖

上图是窄依赖和宽依赖的例子。(方框表示RDD,实心矩形表示分区)

Spark中的宽依赖和窄依赖

1.宽依赖和窄依赖的案例演示

Spark中的宽依赖和窄依赖

注:带ByKey的算子都是发生了宽依赖,(带ByKey的都进行了一次shuffle,进行了shuffle就一定会发生宽依赖)join操作本身是宽依赖,但是有一种情况例外,当父RDDhash分区后再进行join操作,此时发生的就是窄依赖。