spark-5 DAG图和stage

DAG

DAG(Directed Acyclic Graph)叫做有向无环图(有方向,无闭环),在spark中用不表示数据的流向。原始的RDD经过一系列的转换之后会生成DAG

单词统计生成的DAG
在这里插入图片描述

stage

stage即spark任务的调度阶段

  • 一个job会被拆分成多组Task,每组task组成一个stage
  • 一个job对应多个stage

stage分为2种类型

  • ShuffleMapStage
    • 最后一个shuffle之前的所有变换的stageShuffleMapStage
      • ShuffleMapStage对应的task称为ShuffleMapTask
  • ResultStage
    • 最后一个shuffle之后的所有变换的stageResultStage
      • 它对应的taskResultTask

为什么要划分stage

根据RDD之间依赖关系的不同将DAG划分成不同的Stage(调度阶段)
对于窄依赖,partition的转换处理在一个Stage中完成计算
对于宽依赖,由于有Shuffle的存在,只能在parent RDD处理完成后,才能开始接下来的计算

划分stage的好处

  • 由于划分完stage之后,在同一个stage中只有窄依赖,没有宽依赖,可以实现流水线计算
  • stage中的每一个分区对应一个task,在同一个stage中就有很多可以并行运行的task

如何划分stage

划分stage的依据就是宽依赖。从后往前推,底层直接根据递归思想看是否有父节点、是否依赖多个父节点,即可知己遍历整个血统。

  1. 首先根据RDD的算子操作生成DAG有向无环图,并创建一个空的stage作为全部stage的最后一个stage
  2. 把最后一个RDD加入到刚刚创建的stage中,再从最后一个RDD向前推,将遇到宽依赖前的所有RDD加入当前stage。
  3. 遇到宽依赖创建新的stage,继续重复第二步,知道将所有RDD加入到stage中。

示例

sc.textFile("wordCount.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("/result")

在这里插入图片描述

taskSet

每个stage中的task会封装到一个taskSet中,运行时以taskset为单位提交给taskScheduler。最后提交到worker节点上的executor进程中运行

  • 一个taskset中含有一个或多个task(与RDD的分区数有关)
  • 同一个taskset中的各个task可以并行执行
  • taskset的数量等于stage的数量

在这里插入图片描述

stage和stage之间的联系

rdd与rdd之间存在依赖关系,stage与stage之前也存在依赖关系,前面stage中的task先运行,运行完成了再运行后面stage中的task,也就是说后面stage中的task输入数据是前面stage中task的输出结果数据。

在这里插入图片描述

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页