Spark-Stage任务划分
Spark-Stage任务划分
0.先回忆一下YarnClient运行模式
需要记住的是下面两个:(他们都是发生在Driver端)
切分任务使用的是DAGScheduler,类似于Hadoop的切片。
分配任务使用TaskScheduler,管理由多少任务,具体执行。
1.任务运行的整体流程
RDD Objects:是写的代码。
DAGScheduler:根据shuffle的个数,划分任务。相当于是计划。
TaskScheduler:负责任务的调度。具体的执行是Executor端。TaskScheduler负责告诉Executor在哪里执行。计划生成对应的task。
Worker:负责执行从TaskScheduler发过来的任务。
2.RDD任务切分中间分为:Application、Job、Stage和Task
(1)Application:初始化一个SparkContext即生成一个Application;
(2)Job:一个Action算子就会生成一个Job;
(3)Stage:Stage等于宽依赖的个数加1;
(4)Task:一个Stage阶段中,最后一个RDD的分区个数就是Task的个数。
注意:Application->Job->Stage->Task每一层都是1对n的关系。
3.Stage任务切分
- 程序从main进入到方法中,代码读到sc,会初始化生成一个Application应用。
- 接着执行代码,执行到第一个collect行动算子,会形成一个Job。
- Job会启动DAGScheduler。
- DAGScheduler先找到最后一个RDD,然后往前找宽依赖,找到宽依赖,就切开,创建前面的ScheduleMapStage,创建宽依赖后面的是ResultStage。(Stage的个数=宽依赖+1)
- Task的个数就是在Stage阶段中,最后一个RDD分区的个数相加。
=宽依赖+1) - Task的个数就是在Stage阶段中,最后一个RDD分区的个数相加。
- 任务划分完成后,由TaskSchedule把Task发往对应的Executor端执行。