宽依赖和窄依赖深度剖析.png
RDD依赖关系与stage划分
Spark中RDD的高效与DAG图有着莫大的关系,在DAG调度中需要对计算过程划分stage,而划分依据就是RDD之间的依赖关系。
1. 窄依赖与宽依赖
针对不同的转换函数,RDD之间的依赖关系分为窄依赖(narrow dependency)和宽依赖(wide dependency,也成shuffle dependency)。
1.1 窄依赖
窄依赖是指1个父RDD分区对应1个子RDD的分区。换句话说,一个父RDD的分区对应于一个子RDD的分区,或者多个父RDD的分区对应于一个子RDD的分区。所以窄依赖又可以分为两种情况:
1个子RDD的分区对应于1个父RDD的分区,比如map,filter,union等算子
1个子RDD的分区对应于N个父RDD的分区,比如co-partioned join
1.2 宽依赖
宽依赖是指1个父RDD分区对应多个子RDD分区。宽依赖有分为两种情况
1个父RDD对应非全部多个子RDD分区,比如groupByKey,reduceByKey,sortByKey
1个父RDD对应所有子RDD分区,比如未经协同划分的join
窄依赖与宽依赖.png
总结:如果父RDD分区对应1个子RDD的分区就是窄依赖,否则就是宽依赖。
2. 为什么Spark将依赖分为窄依赖和宽依赖
2.1 窄依赖(narrow dependency