spark源码分析之窄依赖和宽依赖篇
-
窄依赖:子RDD的partition和父RDD的partition是一一对应的。(join操作除外,此操作是多对一)
注意点:- 若parent RDD有已知的partitioner(若已知的partitioner相同,两个RDD会协同,那么就能避免网络传输,两个parent RDD 的相同partition会在同一个节点上),只能产生窄依赖,如上图的“join with inputs co-partitioned”
- 窄依赖一般来说都是transform算子,但是join算子除外,它的父子关系为多对一
-
宽依赖:父partition对子partition是一对多。父RDD中partition中数据都会传输一部分到子RDD的patition中
注意点:- 假设有两个parent RDD,它们都没有已知的partitioner(可以理解为该RDD到其child RDD 重分区函数),那么它们就需要shuffle,使得它们共享同一个partitioner,并且有着相同key的数据会在同一个partition里面。如上图“join with inputs not co-partitioned”
- 宽依赖一般来说都是action算子
- Shuffle过程:会产生stage,内部的数据结构为栈,也就是先进后出