一、作业执行原理
### --- 调度策略
~~~ TaskScheduler会先把 DAGScheduler 给过来的 TaskSet 封装成 TaskSetManager 扔到任务队列里,
~~~ 然后再从任务队列里按照一定规则把它们取出来,由 SchedulerBackend 发送给Executor运行;
![](https://i-blog.csdnimg.cn/blog_migrate/6c4c1f2eda05c8de9d5c0e812954cf7b.png)
### --- TaskScheduler
~~~ TaskScheduler 以树的方式来管理任务队列,树中的节点类型为 Schedulable,
~~~ 叶子节点为TaskSetManager,非叶子节点为Pool:
~~~ TaskScheduler 支持两种调度策略:FIFO(默认调度策略)、FAIR。
![](https://i-blog.csdnimg.cn/blog_migrate/23459e1e6a063b186ad621350ac98d88.png)
二、作业执行原理
### --- FIFO 调度策略
~~~ FIFO调度策略,TaskSetManager 按照到来的先后次序进入队列;
~~~ 出队时直接拿最先进入队列的 TaskSetManager。
~~~ FIFO调度策略是默认模式,在此模式下,只有一个 TaskSetManager 池。
### --- Fair 调度策略
~~~ Fair 模式中有一个 rootPool 和多个子 Pool,各个子 Pool 中存储着所有待分配的 TaskSetManager ;
~~~ 在 Fair 模式中,需要先对子 Pool 进行排序,
~~~ 再对子 Pool 里面的 TaskSetManager 进行排序,因为Pool和
~~~ TaskSetManager 都继承了 Schedulable trait,因此可使用相同的排序算法;
### --- 每个要排序的对象包含三个属性:
~~~ runningTasks值(正在运行的Task数)
~~~ minShare值(时间)
~~~ weight值(权重)
~~~ 比较时会综合考量 runningTasks 值,minShare 值以及 weight 值。
~~~ 备注:minShare、weight的值在配置文件 fairscheduler.xml 中被指定。
~~~ 调度池在构建阶段会先读取 fairscheduler.xml ($SPARK_HOME/conf)文件的相关配置,
### --- 然后进行比较:
~~~ 如果A对象的 runningTasks > minShare,B对象的 runningTasks < minShare,
~~~ 那么B排在A前面;(runningTasks比minShare小的先执行)
~~~ 如果A、B对象的 runningTasks < minShare,
~~~ 么就比较 runningTasks 与 minShare 的比值,谁小谁排前面;(使用率低的先执行)
~~~ 如果A、B对象的 runningTasks > minShare,
~~~ 那么就比较runningTasks与weight的比值(权重使用率),谁小谁排前面。(权重使用率低的先执行)
~~~ 如果上述比较均相等,则比较名字
~~~ 整体上来说就是通过 minShare 和 weight 这两个参数控制比较过程,
~~~ 做到让 minShare 使用率和权重使用率少(实际运行task比例较少)的先运行。
~~~ FAIR模式排序完成后,所有的 TaskSetManager 被放入一个 ArrayBuffer 里,
~~~ 之后依次被取出并发送给 Executor执行。
~~~ 从调度队列中拿到 TaskSetManager 后,由于 TaskSetManager 封装了一个 Stage 的所有 Task,
~~~ 并负责管理调度这些 Task,
~~~ 那么接下来的工作就是 TaskSetManager 按照一定的规则一个个取出 Task
~~~ 给 TaskScheduler,TaskScheduler 再交给 SchedulerBackend ,最终分发到Executor上执行。