TaskScheduler 原理:
1. DAGScheduler 在提交 Taskset 给底层调度器的时候是面向接口 TaskScheduler 的, 这符合面向对象中依赖抽象原则,带来底层资源调度器的可插拔性, 导致 Spark 可以运行在众多的资源高度器模式上。例如: Standalone, Yarn, Mesos, local. EC2 及其它自定义的资源调度器
2. 在 SparkContext 实例化的时候通过 createTaskScheduler 来创建 TaskSchedulerImpl 和 StandaloneSchedulerBackend。在 TaskSchedulerImpl 的 initialize 方法中把 StandaloneSchedulerBackend 传进来从而赋值给 TaskSchedulerImpl 的 backend;在 TaskSchedulerImple 调用 start 方法的时候会调用 backend.start 方法。
3. TaskScheduler 的核心任务是提交 TaskSet 到集群运算并汇报结果
a) 为 TaskSet 创建和维护一个 TaskSetManager 并追踪任务的本地性以及错误信息;
b) 遇到 Straggle 任务会放到其它的节点进行重试
c) 向 DAGScheduler 汇报执行情况,包括在 Shuffle 输出 lost 的时候报告 fetch failed 错误等信息
4. TaskScheduler 内部会握有 SchedulerBackend,从 Standalone 的模式来讲,具体实现是 StandaloneSchedulerBackend。
5. StandaloneSchedulerBackend 在启动的时候创建 StandaloneAppClient 实例并在该实例 Start 的时候启动了 ClientEndpoint 这个消息循环体,ClientEndpoint 在启动的时候会向 Master 注册当前程序。而 StandaloneSchedulerBackend 的父类 CoarseGrainedSchedulerBackend 在 start 的时候会实例化类型为 DriverEndpoint 的消息循环体。StandaloneSchedulerBackend 专门负责收集 Worker 上的资源信息。当 ExecutorBackend 启动的时候会发送 RegisteredExecutor 信息向 DriverEndpoint 注册。此时 StandaloneSchedulerBackend 就掌握了当前应用程序拥有的计算资源,就是通过 StandaloneSchedulerBackend 拥有的计算资源来具体运行 Task。
6. SparkContext、DAGScheduler、TaskSchedulerImpl、StandaloneSchedulerBackend 在应用程序启动的时候只实例化一次,应用程序存在期间始终存在这些对象。
来源: http://www.bubuko.com/infodetail-2439219.html