Spark Stage

Spark Stage

什么是Stage

Spark中的一个Stage只不过是物理执行计划其中的一个步骤,它是物理执行计划的一个执行单元。一个Job会被拆分为多组Task,每组任务被称为一个Stage,可以简单理解为MapReduce里面的Map Stage, Reduce Stage。

spark task提交原理

Spark的Job中Stage之间会有依赖关系。可以利用这些依赖关系把Job所有stage串连起来形成一个有向无环图。在单个job内是根据shuffle算子来拆分stage的,shuffle之前是一个stage,shuffle之后是另一个stage,如果一个job中有多个shuffle,那么每个shuffle之前都是一个stage。一个job被提交运行之后,将会触发stage及其父stage的执行。

spark stage

窄依赖
指父RDD的每一个分区最多被一个子RDD的分区所用,表现为一个父RDD的分区对应于一个子RDD的分区,和两个父RDD的分区对应于一个子RDD 的分区。图中,map/filter和union属于第一类,对输入进行协同划分(co-partitioned)的join属于第二类。

宽依赖
指子RDD的分区依赖于父RDD的所有分区,这是因为shuffle类操作,如图中的groupByKey和未经协同划分的join。
spark 宽依赖窄依赖

Stage:
一个Job会被拆分为多组Task,每组任务被称为一个Stage就像Map Stage, Reduce Stage。Stage的划分,简单的说是以ShuffleMapStage 和ResultStage 这两种类型来划分。

在Spark中有两类task,一类是shuffleMapTask,一类是resultTask,第一类task的输出是shuffle所需数据,第二类task的输出是result,stage的划分也以此为依据,shuffle之前的所有变换是一个stage,shuffle之后的操作是另一个stage。

比如 rdd.parallize(1 to 10).foreach(println) 这个操作没有shuffle,直接就输出了,那么只有它的task是resultTask,stage也只有一个;

如果是rdd.map(x => (x, 1)).reduceByKey(_ + _).foreach(println), 这个job因为有reduce,所以有一个shuffle过程,那么reduceByKey之前的是一个stage,执行shuffleMapTask,输出shuffle所需的数据,reduceByKey到最后是一个stage,直接就输出结果了。

如果job中有多次shuffle,那么每个shuffle之前都是一个stage。

Spark会根据RDD之间的依赖关系将DAG图划分为不同的阶段,对于窄依赖,由于partition依赖关系的确定性,partition的转换处理就可以在同一个线程里完成,窄依赖就被spark划分到同一个stage中,而对于宽依赖,只能等父RDD shuffle处理完成后,下一个stage才能开始接下来的计算。之所以称之为ShuffleMapTask是因为它需要将自己的计算结果通过shuffle到下一个stage中。

Spark Stage的分类

在Spark中,Stage可以分成两种类型。分别是:

  • ShuffleMapStage
  1. 这种Stage是以Shuffle为输出边界
  2. 其输入边界可以是从外部获取数据,也可以是另一个ShuffleMapStage的输出
  3. 其输出可以是另一个Stage的开始
  4. ShuffleMapStage的最后Task就是ShuffleMapTask
  5. 在一个Job里可能有该类型的Stage,也可以能没有该类型Stage
  • ResultStage
  1. 这种Stage是直接输出结果
  2. 其输入边界可以是从外部获取数据,也可以是另一个ShuffleMapStage的输出
  3. ResultStage的最后Task就是ResultTask
  4. 在一个Job里必定有该类型Stage

Stage类的定义

Stage类是一个抽象类,类的定义如下:

abstract class Stage {    def findMissingPartitions(): Seq[Int]}

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-28 02:12:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-28 02:12:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-28 02:12:02       87 阅读
  4. Python语言-面向对象

    2024-03-28 02:12:02       96 阅读

热门阅读

  1. 【Python】定时更换clashx工具

    2024-03-28 02:12:02       50 阅读
  2. C语言学习笔记day15

    2024-03-28 02:12:02       43 阅读
  3. 116道网络安全面试题目总结

    2024-03-28 02:12:02       40 阅读
  4. 幸运儿(C语言)

    2024-03-28 02:12:02       42 阅读
  5. 磁盘阵列技术

    2024-03-28 02:12:02       39 阅读
  6. 【Linux】学习笔记~

    2024-03-28 02:12:02       38 阅读
  7. Linux查询日志常用命令整理

    2024-03-28 02:12:02       38 阅读
  8. C++ 大三/大五法则(__cplusplus 前向兼容)

    2024-03-28 02:12:02       40 阅读
  9. Linux编辑器-vim使用

    2024-03-28 02:12:02       42 阅读
  10. 纯CSS实现首尾相接的无限轮播效果

    2024-03-28 02:12:02       37 阅读
  11. 嵌入式Linux:空洞文件

    2024-03-28 02:12:02       38 阅读
  12. MySQL中的窗口函数

    2024-03-28 02:12:02       46 阅读
  13. 【嵌入式DIY实例】-火焰报警系统

    2024-03-28 02:12:02       39 阅读