- TaskScheduler和SchedulerBackend
SchedulerBackend主要负责通信
TaskScheduler主要负责调度Tasks
TaskScheduler负责不同的Job之间的调度,在Task执行失败时启动重试机制,并且为执行慢的Task启动备份的任务,
SchedulerBackend负责与Cluster Manger交互,取得该Application分配到的资源,并且将这些资源传给TaskScheduler,由TaskSchduler为Task最终分配计算资源
-
调用栈
从前一篇文章我们讲到DAGScheduler将Stage提交给TaskScheduler。
调用栈1:TaskScheduler将一个阶段的没有完成的分区对应的任务封装为TaskSet,再封装为TaskSetManager。
TaskSetManager会根据数据的就近原则为Task分配计算资源,监控Task的执行状态并采取必要的措施,比如失败重试,慢任务的推测性执行。
TaskSetManger放到TaskPool
调用栈2的SchedulableBuilder是Application级别的调度器,调度策略可能是FIFO或者FAIR。SchedulableBuilder确定TaskSetManager的调度顺序,TaskSetManager会根据就近原则确定Task运行在哪个Executor上。
调用栈6任务序列化后发送给Executor
Executor运行任务
-
整体
-
本地化级别
进程本地化:数据和计算在同一个进程中,共享共同的内存
节点本地化:同一个节点
机架本地化:同一个机架
任意
Task如果没有最高的本地化级别,那么会先等待一段时间,然后再看有没有,没有的话继续降级,这样可以提高总体的运行性能。 -
失败重试与黑名单
失败时候的消息传递路径:
Executor -> SchedulerBackend -> TaskScheduler -> TaskSetManager。TaskSetManager会记录失败的任务次数,没有超过最大重试次数,将其放回调度的Task池子,否则整个Application失败。
黑名单记录了上次失败的节点,然后下次这个失败的任务就不能继续往这个节点提交了。 -
ShuffleMapTask和ResultTask
ShuffleMapTask根据Task的partitioner将计算结果放到不同的bucket中,而ResultTask将计算结果发送回Driver Application。
网友评论