本文主要是介绍Spark的Task执行原理流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.当Driver中的CoarseGrainedSchedulerBackend给CoarseGrainedExecutorBackend发送LaunchTask之后,CoarseGrainedExecutorBackend在收到LaunchTask消息后,首先会反序列化TaskDescription
2.Executor会通过launchTask来执行Task
3.TaskRunner在ThreadPool来运行具体的Task,在TaskRunner的run方法中首先会通过调用statusUpdate给Driver发信息汇报自己的状态,说明自己是Running状态
4.TaskRunner内部会做一些准备工作:例如反序列化Task的依赖
5.然后是反序列化Task本身
6.调用反序列化后的Task.run方法来执行任务并获取执行结果
其中Task的run方法调用时会到时Task的抽象方法runTask的调用,runTask内部会调用RDD的iterator()方法,该方法就是针对当前Task所对应的Partition进行计算的关键所在,在处理内部会迭代Partition的元素,并交给我们自定义的function进行处理。
ShuffleMapTask
ShuffleMapTask在计算具体的Partition之后会通过ShuffleManager获得的ShuffleWriter把当前Task计算的结果根据具体的ShuffleManager的实现来写入到具体的文件,操作完成后会把MapStatue发送给DAGScheduler。
ResultTask
根据前面Stage的执行结果进行Shuffle产生整个Job最后的结果
MapOutputTracker 会把ShuffleMapTask执行结果交给ResultTask。
Driver -> DAGScheduler -> MapOutputTracker ->
对于ShuffleMapTask,首先要对RDD极其依赖关系进行反序列化
最终计算会调用RDD的compute方法。
7.把执行结果序列化
补充:
1.在执行具体Task的业务逻辑前会进行四次反序列化
a>TaskDescription
b>反序列化Task的依赖
c>Task
d>RDD
2.
这篇关于Spark的Task执行原理流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!