Spark任务将一系列RDD(算子)组成一张有向无环图(DAG)。这些RDD之间会有一定的依赖关系,并且根据RDD之间的依赖关系来划分Spark任务的阶段(Stage)。本节就来介绍RDD依赖关系和Stage的相关知识。
1.RDD之间的依赖关系
在Spark任务链中,子RDD与父RDD之间的依赖关系分为两种:窄依赖(narrow dependency)和宽依赖(wide dependency)。它们的定义如下:
1.1窄依赖
窄依赖指的是:每一个父RDD的分区Partition最多被子RDD的一个分区Partition使用。下图是一些窄依赖的例子:
image
常见的窄依赖的算子有:map,filter,union等等。
1.2宽依赖
宽依赖指的是:一个父RDD的分区Partition会被多个子RDD的分区Partition使用。下面是一些宽依赖的例子:
image
常见的宽依赖的算子有:join,groupBy,reduceBy等等。
2.Spark任务的阶段(Stage)
DAG(Directed Acyclic Graph)叫做有向无环图。原始的RDD通过一系列的转换就形成了DAG。根据RDD之间的依赖关系的不同可以将DAG划分成不同的阶段Stage。对于窄依赖,分区的转换处理在stage中完成计算;对于宽依赖,由于shuffle的存在,只能在父RDD处理完成后,才能开始接下来的计算。因此宽依赖是换分stage的依据。
划分Stage的具体做法如下:
image
- 先画出各个RDD之间的宽窄依赖关系
- 然后去掉所有款依赖的边,保留所有窄依赖的边
- RDD连同窄依赖的边就形成一个Stage
- Stage的顺序按照执行顺序编号
所以上图中的DAG就划分成3个Stage:Stage1包括RDD A;Stage2包括RDD C、D、E、F;Stage3包括RDD B、G。
划分了阶段能帮助我们更好的理解Spark任务的执行过程。本节就介绍到这里。祝你玩得愉快!