Task的执行流程:
1. Driver端中的 CoarseGrainSchedulerBackend 给 CoarseGrainExecutorBacken 发送 LaunchTask 消息
2. CoarseGrainExecutorBacken 在收到消息后,首先会反序列化 TaskDescription
3. Executor 通过 launchTask 来执行 Task
4. TaskRunner 用 ThreadPool 来运行具体的 Task。在 TaskRunner 的 run 方法中首先会调用 statusUpdate 给 Driver发消息汇报自己现在的状态是 Running 状态。
5. TaskRunner 内部会做一些准备工作,如反序列化 Task 的依赖。然后通过网络来获取依赖的文件、Jar 等
6. 反序列化 Task本身
7. 调用反序列化后的 Task.run 方法来执行任务 并获得执行结果。run 方法内部会调用 runTask,这个方法内部会调用 RDD 的 iterator() 方法,iterator 方法就是我们针对当前 Task所对就的 Partition 进行计算的关键所在,会迭代 Partition 的数据并交给我们自定义的 function 进行处理。
对于 ShuffleMapTask, 首先要对 RDD 以及其依赖关系进行反序列化。
8. 把执行结果序列化,并根据大小判断不同的结果传回给 Driver 的方式
9. CoarseGrainExecutorBackend 给 DriverEndpoint 发送 StatusUpdate来传输执行结果, DriverEndpoint 会把执行结果传递给 TaskSchedulerImpl 处理, 针后交给 TaskResultGetter 内部通过线程去分别处理 Task 成功和失败时候的不同情况,然后告诉 DAGScheduler 任务处理结束的状况。
补充说明: 在执行具体 Task 的业务逻辑前会进行四次反序列化:
1. TaskDescription 的反序列化
2. 反序列化 Task 的依赖
3. Task 的反序列化
4. RDD反序列化