Spark-Stage任务划分

Spark-Stage任务划分

0.先回忆一下YarnClient运行模式

Spark-Stage任务划分

需要记住的是下面两个:(他们都是发生在Driver端)

​ 切分任务使用的是DAGScheduler,类似于Hadoop的切片。

​ 分配任务使用TaskScheduler,管理由多少任务,具体执行。

1.任务运行的整体流程

Spark-Stage任务划分

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任务切分

Spark-Stage任务划分

  1. 程序从main进入到方法中,代码读到sc,会初始化生成一个Application应用。
  2. 接着执行代码,执行到第一个collect行动算子,会形成一个Job。
  3. Job会启动DAGScheduler。
  4. DAGScheduler先找到最后一个RDD,然后往前找宽依赖,找到宽依赖,就切开,创建前面的ScheduleMapStage,创建宽依赖后面的是ResultStage。(Stage的个数=宽依赖+1)
  5. Task的个数就是在Stage阶段中,最后一个RDD分区的个数相加。
    =宽依赖+1)
  6. Task的个数就是在Stage阶段中,最后一个RDD分区的个数相加。
  7. 任务划分完成后,由TaskSchedule把Task发往对应的Executor端执行。