RDD的依赖关系

Lineage(血统)

在spark中,数据的处理和计算都是通过RDD的转换进行的。由于RDD是不可变的,在转换的过程中就会生成新的RDD。而这些RDD的顺序就形成了类似血缘的关系,新的RDD会依赖于旧的RDD。spark会将这一血缘关系记录下来,这样就能提高容错性能,当集群中有节点宕机后造成RDD部分数据丢失,就可以根据这个Lineage来进行重新计算来恢复丢失的数据。在RDD中有一个toDebugString方法来查看Lineage。

窄依赖

窄依赖就是父RDD的一个分区,最多只能给子RDD的一个分区使用,就是典型的1对1关系。如图所示:
在这里插入图片描述

宽依赖

宽依赖是指父RDD的一个分区被子RDD的多个分区使用,是1对多的关系。宽依赖会引起shuffle,速度会比较慢,因为shuffle的话要等对应的父RDD的所有分区的数据全部处理完才能进行处理,如下图所示:
在这里插入图片描述

DAG(有向无环图)

spark中的RDD经过一些列转换就形成了DAG。根据RDD之间的依赖关系的不同将DAG划分成不同的Stage,对于窄依赖,partition的转换处理在Stage中完成计算。对于宽依赖,由于有Shuffle的存在,只能在parent RDD处理完成后,才能开始接下来的计算,因此宽依赖是划分Stage的依据。通过下图我们可以清楚的知道,stage = shuffle次数 + 1。
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章