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被哈希分区)。见下图:
上图是窄依赖和宽依赖的例子。(方框表示RDD,实心矩形表示分区)
1.宽依赖和窄依赖的案例演示
注:带ByKey的算子都是发生了宽依赖,(带ByKey的都进行了一次shuffle,进行了shuffle就一定会发生宽依赖)join操作本身是宽依赖,但是有一种情况例外,当父RDD被hash分区后再进行join操作,此时发生的就是窄依赖。