Spark中涉及的资源调度可以分为4层:
- YARN对不同SparkApplication(SparkContext)的调度
- 同一个SparkAppliction内不同资源池(pool)之间的调度
- 同一个SparkAppliction内同一个资源池(pool)内不同TaskSetManager的调度
- 同一个SparkAppliction内同一个资源池(pool)内同一个TaskSetManager内的Task调度
前置为啥需要资源调度
当用户提交作业,Spark内部的执行流程如下图:
Spark上层的SQL/Streaming等最终都会生成RDD到底层SparkCore执行。如上图所示当RDD执行一个action类型的算子(如collect)会触发一个Job的提交到DAGScheduler,DAGScheduler会将Job拆成Stage(根据shuffle来拆分Stage)形成一个DAG,拆分的Stage之间有依赖关系,最后执行的是ResultStage,ResuStage之前会依赖ShuffleMapStage等,每个Stage的执行都需要先将它的父Stage执行完成。
当提交一个Stage执行时,Spark会给Stage生成一个对应的TaskSetManager,TaskSetManager用来管理该Stage中所有的Task。