Driver 中的 CoarseGrainedSchedulerBackend 给 CoarseGrainedExecutorBackend 发送 LaunchTask 消息
反序列化TaskDescription
点击进入decode方法
Executor会通过 launchTask执行 Task。
点击进入launchTask方法
Executor的launchTask方法先是创建一个TaskRunner实例,点击进TaskRunner,然后往下找找到run方法
点击进入task.run方法
这个文件往下滑
点击进去runTask方法,可以看到runTask方法是一个抽象方法
我们知道Task有两种类型,分别是ShuffleMapTask和 ResultTask,我们依次来看一下这两个类是如何实现runTask方法的
首先是ShuffleMapTask的
上图第99行,调用了RDD的iterator方法,点击进去,
再点击进computeOrReadCheckpoint方法
RDD的compute 方法是一个抽象方法,每个 RDD 都需要重写这个方法。
这里,我们选择查看MapPartitionsRDD的compute方法
通过迭代器的不断叠加,将每个 RDD 的小函数合并成一个大的函数流。通过shuffleManager获得的shuffleWriter把当前 Task 计算的结果根据具体的shuffleManager实现写入到具体的文件中 ,操作完成后会把 MapStatus发送给Driver端的 DAGScheduler的MapOutputTracker。
接着我们来看一下ResultTask