域名 做网站和邮箱,阳江网络问政平台回复查询,网站开发的进度控制计划表,网站排名优化+o+mSpark Stage
什么是Stage
Spark中的一个Stage只不过是物理执行计划其中的一个步骤#xff0c;它是物理执行计划的一个执行单元。一个Job会被拆分为多组Task#xff0c;每组任务被称为一个Stage#xff0c;可以简单理解为MapReduce里面的Map Stage#xff0c; Reduce Stag…Spark Stage
什么是Stage
Spark中的一个Stage只不过是物理执行计划其中的一个步骤它是物理执行计划的一个执行单元。一个Job会被拆分为多组Task每组任务被称为一个Stage可以简单理解为MapReduce里面的Map Stage Reduce Stage。 Spark的Job中Stage之间会有依赖关系。可以利用这些依赖关系把Job所有stage串连起来形成一个有向无环图。在单个job内是根据shuffle算子来拆分stage的shuffle之前是一个stageshuffle之后是另一个stage如果一个job中有多个shuffle那么每个shuffle之前都是一个stage。一个job被提交运行之后将会触发stage及其父stage的执行。 窄依赖 指父RDD的每一个分区最多被一个子RDD的分区所用表现为一个父RDD的分区对应于一个子RDD的分区和两个父RDD的分区对应于一个子RDD 的分区。图中map/filter和union属于第一类对输入进行协同划分co-partitioned的join属于第二类。
宽依赖 指子RDD的分区依赖于父RDD的所有分区这是因为shuffle类操作如图中的groupByKey和未经协同划分的join。
Stage: 一个Job会被拆分为多组Task每组任务被称为一个Stage就像Map Stage Reduce Stage。Stage的划分简单的说是以ShuffleMapStage 和ResultStage 这两种类型来划分。
在Spark中有两类task一类是shuffleMapTask一类是resultTask第一类task的输出是shuffle所需数据第二类task的输出是resultstage的划分也以此为依据shuffle之前的所有变换是一个stageshuffle之后的操作是另一个stage。
比如 rdd.parallize(1 to 10).foreach(println) 这个操作没有shuffle直接就输出了那么只有它的task是resultTaskstage也只有一个
如果是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
这种Stage是以Shuffle为输出边界其输入边界可以是从外部获取数据也可以是另一个ShuffleMapStage的输出其输出可以是另一个Stage的开始ShuffleMapStage的最后Task就是ShuffleMapTask在一个Job里可能有该类型的Stage也可以能没有该类型Stage
ResultStage
这种Stage是直接输出结果其输入边界可以是从外部获取数据也可以是另一个ShuffleMapStage的输出ResultStage的最后Task就是ResultTask在一个Job里必定有该类型Stage
Stage类的定义
Stage类是一个抽象类类的定义如下
abstract class Stage { def findMissingPartitions(): Seq[Int]}