6.7.3 FIFO调度器分析
当前Hadoop自带了多个任务调度器,最常用的是FIFO(默认调度器)、Capacity Scheduler和Fair Scheduler三种。在本小节中,我们重点介绍FIFO调度器,其他两种将在第10章介绍。
FIFO,顾名思义,即首先到达的作业优先获得调度机会。它是由类org.apache.hadoop.mapred.JobQueueTaskScheduler实现的,其类关系如图6-14所示。
图 6-14 FIFO类关系图
JobQueueTaskScheduler同时向JobTracker注册了两种作业监听器,功能如下。
❑EagerTaskInitializationListener对用户提交的作业进行初始化:考虑到待初始化的作业可能非常多,因此需采用一定的策略决定新提交作业的初始化顺序,基本策略是优先选择优先级高的作业,当优先级相同时,优先选择提交时间早的作业。
❑JobQueueJobInProgressListener维护作业的调度顺序:该作业监听器维护了作业被调度的顺序,其排序原则跟初始化顺序类似:先按作业优先级排序,然后是作业提交时间,最后是作业ID。
基于以上两种作业监听器,JobQueueTaskScheduler的调度机制(由函数assignTasks实现)如下。
❑计算可用slot数目:FIFO调度器尽量将所有任务均衡地调度到各个TaskTracker,以便均衡地使用各个节点上的资源。对于TaskTracker X,假设它的slot总数为trackerCapacity,当前正在运行的任务数为trackerRunningTasks,则可通过以下方法计算它当前可使用的slot数目:
其中,numTasks和finishedTasks表示作业总的任务数和已经完成的任务数,totalSlots表示系统的slot总数。
❑分配任务:遍历作业队列(已按照调度顺序排好序),并依次调用JobInProgress类中的obtainNewMapTask和obtainNewReduceTask为该TaskTracker选择availableSlots个任务。