Task的生产过程详解:
1, 当Driver中的CoarseGrainedSchedulerBackend给CoarseGrainedExecutorBackend发送LaunchTask之后,CoarseGrainedExecutorBackend在收到LaunchTask消息后,首先会反序列化TaskDescription。
1, Executor会通过会通过launchTask来执行Task,在launchTask方法中new出来TaskRunner,TaskRunner继承至Runnable接口。
3,TaskRunner在ThreadPool来运行具体的Task,在TaskRunner的run方法中首先会通过调用statusUpdate给Driver发信息汇报自己的状态说明自己是Running状态。其中execBackend是ExecutorBackend,ExecutorBackend是一个trait,其具体的实现子类是CoarseGrainedExecutorBackend ,其中的statusUpdate方法中将向Driver提交StatusUpdate消息。
4, TaskRunner内部会做一些准备工作:例如反序列化Task的依赖,然后通过网络来获取需要的文件、Jar等;
5, 然后是反序列Task本身;
6, 调用反序列化后的Task.run方法来执行任务并获得执行结果。其中Task的run方法调用的时候会导致Task的抽象方法runTask的调用,在Task的runTask内部会调用RDD的iterator()方法,该方法就是我们针对当前Task所对应的Partition进行计算的关键之所在ÿ