Spark Task 概述

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反序列化

posted @ 2017-12-28 22:10  一剑侵心  阅读(772)  评论(0编辑  收藏  举报