Spark从入门到精通17:RDD的依赖关系

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
  1. 先画出各个RDD之间的宽窄依赖关系
  2. 然后去掉所有款依赖的边,保留所有窄依赖的边
  3. RDD连同窄依赖的边就形成一个Stage
  4. Stage的顺序按照执行顺序编号

所以上图中的DAG就划分成3个Stage:Stage1包括RDD A;Stage2包括RDD C、D、E、F;Stage3包括RDD B、G。

划分了阶段能帮助我们更好的理解Spark任务的执行过程。本节就介绍到这里。祝你玩得愉快!

你可能感兴趣的:(Spark从入门到精通17:RDD的依赖关系)