架构图:
代码提交时序图
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 等等,有兴趣的去关注一下。。。。。。。。