窄依赖:
每个父RDD中的partition最多被子RDD中的一个Partition所使用;子RDD中partition的个数大于等于父RDD中partition的个数
- 父RDD与子RDD是一对一的依赖关系(OneToOneDependency):map、filter、join with inputs co-partitioned;
注:子RDD只依赖父RDD中相同partitionID的partition - 父RDD与子RDD是一对一的范围内依赖关系(RangeDependency):union
宽依赖:
一个父RDD的partition会被多个子RDD的partition所使用,会导致计算中产生shuffle;
- eg:groupByKey、join with inputs not co-partitioned
- 存在问题:由于一个父RDD的一个partition对应子RDD的多个partition,会出现部分计算结果丢失,单一计算丢失的数据无法达到效果,便重新计算该步骤中的所有数据,从而导致计算数据重复。
注意:
宽依赖一定有shuffle,有shuffle不一定是宽依赖;
两个要join的rdd的partition数相同,这种情况是窄依赖,其余情况的join都是宽依赖
DAG
生成重点是stage划分,划分依据是RDD之间的依赖关系;
程序提交后,高度调度器将所有RDD看成一个stage,对此stage从后往前回溯,遇到shuffle就断开,遇到窄依赖则归并到同一个stage,等所有步骤回溯完成,则形成一个DAG图
- 窄依赖:RDD之间的数据不需要shuffle,多个数据处理可以在同一台机器的内存中完成,所以在spark中被划分为同一个stage;
- 宽依赖:由于shuffle的存在,必须等到父RDD的shuffle处理完后才开始接下来的计算,所以会在此处划分stage;