当前位置: 首页 > news >正文

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]}
http://www.lryc.cn/news/324308.html

相关文章:

  • 【国家计算机二级考试C语言.2024】学习备忘录
  • 十分钟掌握redis精髓指令
  • 突然断电导致git损坏修复
  • MATLAB入门指南:从零开始进行数学建模竞赛
  • 【JavaEE初阶系列】——带你了解volatile关键字以及wait()和notify()两方法背后的原理
  • GitHub配置SSH Key(详细版本)
  • JavaScript 权威指南第七版(GPT 重译)(六)
  • Learning to summarize from human feedback
  • 数据库迁移测试
  • ASP .Net Core ILogger日志服务
  • LeetCode 2657.找到两个数组的前缀公共数组
  • 【jvm】jinfo使用
  • C++ Thread 源码 观后 自我感悟 整理
  • 2024阿里云2核2G服务器租用价格99元和61元一年
  • 刚刚!奥特曼剧透GPT-5,将在高级推理功能上实现重大进步
  • uniapp使用Canvas给图片加水印把临时文件上传到服务器
  • 小希的迷宫
  • MySQL索引剖析【了解背后的数据结构】
  • 004——内存映射(基于鸿蒙和I.MAX6ULL)
  • 150 Linux C++ 通讯架构实战6 服务器程序目录规划,makefile编写
  • OpenCV支持哪些类型的文件格式读写?
  • 数据库中使用IN操作效率问题
  • unity学习(67)——控制器Joystick Pack方向
  • MATLAB的使用(一)
  • JMeter并发工具的使用
  • 基于springboot+vue的毕业就业信息管理系统
  • 有什么小程序适合个人开发?
  • 【ARXIV2402】MambaIR
  • 【计算机网络篇】数据链路层(3)差错检测
  • 软件配置管理计划