一、宽依赖与窄依赖
宽依赖(Wide or shffle Dependencies)和窄依赖(Narrow Dependencies)。
1.如图所示一个空心方框表示一个RDD,实心蓝底的框表示partition。
2.宽依赖与窄依赖的区分主要是父partition与子partition的对应关系
(注:箭头之前的为父partition,箭头之后的为子partition)。
窄依赖(图左):父partition对子partition是一对一或多对一(只有一个儿子)。
宽依赖(图右):父partition对子partition是一对多(有多个儿子)。
窄依赖一般是对RDD进行map,filter,union等Transformations。
宽依赖一般是对RDD进行groupByKey,reduceByKey等操作,就是对RDD中的partition中的数据进行重分区(shffle)。
join操作即可能是宽依赖也可能是窄依赖,当要对RDD进行join操作时,如果RDD进行过重分区则为窄依赖,否则为宽依赖。
二、Stage的划分及容灾数据处理
如上图所示:
A,B,C,D,E,F,G代表RDD
当执行算子有shffle操作的时候,就划分一个Stage。(即宽依赖来划分Stage)
窄依赖会被划分到同一个Stage中,这样它们就能以管道的方式迭代执行。宽依赖由于依赖的上游RDD不止一个,所以往往需要跨节点传输数据。从容灾角度讲,它们恢复计算结果的方式不同。窄依赖只需要重新执行父RDD的丢失分区的计算即可恢复。
而宽依赖则需要考虑恢复所有父RDD的丢失分区,并且同一RDD下的其他分区数据也重新计算了一次。