基本概念

Application:
用户提交的程序
Job:
一个Action算子就是一个job
Stage:
一个job会切分成不同的stage. 宽依赖和窄依赖的分界点就是stage的分界点

Task
一个stage有多个task,一个分区对应一个task
这些task构成taskSet,这些taskSet会被Driver分配到executor上执行.

遇到宽依赖划分新stage

为什么要划分stage?
划分stage的本质是依据是否需要shuffle,需要shuffle的过程和不需要shuffle的过程明显不同,因此需要划分stage.

如下图,2个stage,遇到宽依赖,reduceByKey之前一个stage,之后一个stage(stage划分的依据是遇到宽依赖就划分一个新的stage)
spark job划分依据与stage划分依据
stage0的详情
spark job划分依据与stage划分依据
spark job划分依据与stage划分依据
stage1的详情
spark job划分依据与stage划分依据

spark job划分依据与stage划分依据

job划分

为什么要进行job划分?
转换算子与行动算子结果不同. 行动算子会将结果进行输出.

job划分依据是什么?
当在程序中遇到一个action算子的时候,就会提交一个job,执行前面的一系列操作。因此平时要注意,如果声明了数据需要cache或者persist,但在action操作前释放掉的话,该数据实际上并没有被缓存。

通常一个任务会有多个job,job之间是按照串行的方式执行的。一个job执行完成后,才会起下一个job。有一段时间曾想让job并行执行,但没有找到解决方法。

sortby 底层调用collect,也算行动算子.会生成一个job
spark job划分依据与stage划分依据

spark job划分依据与stage划分依据

总结

  • job的划分依据的是Action算子
  • 每个job可以划分为多个stage
  • stage的划分依据的是是否需要shuffle
  • shuffle的本质是数据在map分区后传输给reduce,当然中间结果会存储到磁盘上.

相关文章: