1) 首先了解作业提交后RDD的流动情况
image.png
如上图,以RDD构建的DAG给DAGScheduler进行stage划分,DAGScheduler负责stage层面的提交和失败处理。然后提交taskSet给TaskScheduler进行处理,TaskScheduler负责task层面的提交和失败处理,TaskScheduler提交task给远端的Worker(即Executor)实际执行。
上面流程中,在TaskScheduler提交task给executor之前,所有操作都是在Driver端执行(如以yarn-client提交,则为提交作业所在机器),Executor接受到task后执行task作业则是executor机器上执行。
2) 更细粒度了解作业提交过程
image.png
上图是client以spark-submit形式提交作业后,从作业DAG划分、stage提交、taskSet提交,到task执行过程。
步骤图上已经画出来,这里描述一下。
- client submit作业,通过反射invoke执行用户代码main函数。
- submit作业后,开始启动CoarseGrainedExecutorBackend和初始化SparkContext。
- SparkContext初始化包括初始化监控页面SparkUI、执行环境SparkEnv、安全管理器SecurityManager、stage划分及调度器DAGScheduler、task作业调度器TaskSchedulerImpl和与Executor通信的调度端CoarseGrainedSchedulerBackend。
- DAGScheduler将作业划分后,依次提交stage对应的taskSet给TaskSchedulerImpl。
- TaskSchedulerImpl会submit taskset给driver端的CoarseGrainedSchedulerBackend后端。
- CoarseGrainedSchedulerBackend会一个一个的LaunchTask
- 在远端的CoarseGrainedExecutorBackend接收到task提交event后,会调用Executor执行task
- 最终task是由TaskRunner的run方法内运行。