上图:
流程大致如下:
1)spark-submit通过命令行的方式提交任务;
2)任务提交后会和ResourceManager通讯申请启动ApplicationMaster;
3)随后ResourceManager分配container,并在合适的NodeManager上启动ApplicationMaster;
4)ApplicationMaster启动后会创建Driver线程来执行用户的作业;
5)ApplicationMaster继续向ResourceManager申请资源创建Executor;
6)ResourceManager接到资源申请后会分配container,并在合适的NodeManager上启动Executor;
7)Executor启动之后会向Driver进行反向注册;
8)在Executor全部注册完之后Driver开始执行main函数,之后在每执行到Action算子时触发一个job,并根据宽依赖开始划分stage,然后每个stage生成对应的taskSet,之后将task分发到各个Executor上执行。