Spark2.3.2源码解析: 10. 调度系统 Task任务提交 (三) TaskScheduler : Executor 任务提交

架构图:

代码提交时序图

Standalone模式提交运行流程图:

首先写一个WordCount代码(这个代码,为了观察多个stage操作,我写了两个reducebykey 函数)

源代码:

直接执行代码,查看spark执行程序时,将代码划分stage生成的DAG流程图

可知: WordCount 在stage划分的时候,划分为三个stage 

即在代码中如下标识:

本文继续说task提交:

接上文,本文讲根据分配的资源启动task

org.apache.spark.scheduler.cluster.CoarseGrainedSchedulerBackend#launchTasks

首先看一下,传入的对象:TaskDescription

TaskDescription任务信息:

    taskId: Long :  任务id
    attemptNumber: Int, 重试次数
    executorId: String : executor的Id ,即task分配给具体哪个executor
    name: String, 任务名称
    index: Int :   任务在TaskSet中的索引 
    addedFiles: Map[String, Long] : 任务依赖的文件
    addedJars: Map[String, Long] : 任务依赖的jar包
    properties: Properties : 任务依赖的属性
    serializedTask: ByteBuffer 序列化 

executor 启动task , 调用:org.apache.spark.executor.Executor#LaunchTask 方法  


executorData.executorEndpoint.send(LaunchTask(new SerializableBuffer(serializedTask)))

1.将task封装成 TaskRunner 
2.加入等待队列 runningTasks 
3.执行线程 TaskRunner

启动  TaskRunner  。。。。。。。。。。。

org.apache.spark.executor.Executor.TaskRunner # run

org.apache.spark.scheduler.Task#run

执行这个类中的run方法

执行task中的run方法
//TODO  ShuffleMapTask
//TODO  ResultTask

org.apache.spark.ShuffleMapTask#ResultTask

org.apache.spark.scheduler#ResultTask 

其他的就是将task中的一些运行信息直接返回,发送给drver、bolckmanager 等等,有兴趣的去关注一下。。。。。。。。

猜你喜欢

转载自blog.csdn.net/zhanglong_4444/article/details/85341677
今日推荐