Spark之SparkCore:RDD-数据核心/API【DAG的生成和划分Stage】

1、概念

\quad \quad DAG(Directed Acyclic Graph) 叫做有向无环图。

在这里插入图片描述

2、DAG的生成

\quad \quad 原始的RDD通过一系列的转换操作就形成了DAG有向无环图,任务执行时,可以按照DAG的描述,执行真正的计算(数据被操作的一个过程)。
在这里插入图片描述
DAG的边界

  • 开始:通过SparkContext创建的RDD
  • 结束:触发Action,一旦触发Action就形成了一个完整的DAG

3、划分stage

在这里插入图片描述
为什么要划分Stage? --并行计算

\quad \quad 一个复杂的业务逻辑如果有shuffle,那么就意味着前面阶段产生结果后,才能执行下一个阶段,即下一个阶段的计算要依赖上一个阶段的数据。那么我们按照shuffle进行划分(也就是按照宽依赖就行划分),就可以将一个DAG划分成多个Stage/阶段,在同一个Stage中,会有多个算子操作,可以形成一个pipeline流水线,流水线内的多个平行的分区可以并行执行

如何划分DAG的stage?

\quad \quad Spark会根据shuffle/宽依赖使用回溯算法来对DAG进行Stage划分,从后往前,遇到宽依赖就断开,将宽依赖前面的所有代码划分为一个stage;遇到窄依赖就把当前的RDD加入到当前的stage/阶段中

  • 对于窄依赖,partition的转换处理在stage中完成计算,不划分(将窄依赖尽量放在在同一个stage中,可以实现流水线计算)
  • 对于宽依赖,由于有shuffle(shuffle常见算子)的存在,只能在父RDD处理完成后,才能开始接下来的计算,也就是说需要要划分stage(出现宽依赖即拆分)

猜你喜欢

转载自blog.csdn.net/weixin_45666566/article/details/112553957