核心算法流程
当某个tasktracker上出现空闲slot时,调度器依次选择一个queue、(选中的queue中的)job、(选中的job中的)task,并将该slot分配给该task。下面介绍选择queue、job和task所采用的策略:
(1)选择queue:将所有queue按照资源使用率(numSlotsOccupied/capacity)由小到大排序,依次进行处理,直到找到一个合适的job。
(2)选择job:在当前queue中,所有作业按照作业提交时间和作业优先级进行排序(假设开启支持优先级调度功能,默认不支持,需要在配置文件中开启),调度依次考虑每个作业,选择符合两个条件的job:[1] 作业所在的用户未达到资源使用上限 [2] 该TaskTracker所在的节点剩余的内存足够该job的task使用。
(3)选择task,同大部分调度器一样,考虑task的locality和资源使用情况。(即:调用JobInProgress中的obtainNewMapTask()/obtainNewReduceTask()方法)
参考自:http://dongxicheng.org/mapreduce/hadoop-capacity-scheduler/
CapacityScheduler辅助类
类的静态结构
CapacityTaskScheduler是核心类,我们先看它的辅助类
CapacityTaskScheduler的辅助类都是内部类,下面逐个描述:
(1)TaskSchedulingMgr类
它是任务调度管理,抽象类,包括三个成员:
protected CapacityTaskScheduler scheduler;
protected TaskType type = null;
privateList<CapacitySchedulerQueue> queuesForAssigningTasks =
newArrayList<CapacitySchedulerQueue>();