1.1 在client使用spark-submit提交一个spark任务后
- 首先,每个任务会对应启动一个Driver进程
- 然后,Driver进程为spark任务申请资源:向集群管理器Resource Manager申请运行Spark作业需要使用的资源,主要的资源是Executor进程,Executor进程数量以及所需的CPU core可以通过spark任务设置的资源参数来指定;
- 其次,Driver进程会将Spark任务代码分拆为多个stage:资源申请完毕后,开始调度与执行任务代码,第一步就是将job拆分多个stage;
- 然后,Driver进程为每个stage创建一批task;
- 最后,将这些task分配到各个Executor进程中执行。
1.2 相关概念
1.2.1 Job
job指的是在提交的spark任务中一个action,可以在spark ui的Jobs中可以看到Active Jobs为你的action的名称。
1.2.2 stage
一个job会被拆分为一个或多个stage来执行,每个stage执行一部分代码片段,各个stage会按照执行顺序来执行,而job按照什么规则来划分stage呢?
spark根据shuffle类算子(如join)来进行stage的划分,即在shuffle类算子之前的代码为一个stage,在该shuffle类算子之后的代码则会下一个stage,那么每个stage的执行不需要对整个数据集进行shuffle即可完成。
1.2.3 task
一个stage由一批task线程来执行,task是spark最小的计算单元,每个task执行相同的逻辑计算,但使用不同分区的数据,一个分区一个task。