作业的调度
早期版本中按照作业提交的顺序,使用FIFO调度算法来运行作业。
随后,加入设置作业优先级的功能,可以通过设置mapred.job.priority属性货JobClient的setJobPriority()方法来设置优先级。作业调度器选择要运行的下一个作业时,它选择的是优先级最高的那个作业。然而,优先级并不支持抢占,所以高优先级的作业仍然会被那些在高优先级作业被调度之前已经开始的、长时间运行的低优先级的作业所阻塞。
在Hadoop中,MapReduce的调度器可以选择。默认的调度器是原始的基于队列的FIFO调度器,还有两个多用户调度器,分别为Fair Scheduler和Capacity Scheduler。
Fair Scheduler
Fair Scheduler(公平调度器)的目标是让每个用户公平的共享集群能力。某个用户的一个短的作业将在合理的时间内完成,即便另一个用户的长时间作业正在运行而且还在运行过程中。
作业都被放在作业池中,在默认情况下,每个用户都有自己的作业池。
Fair Scheduler支持抢占,所以,如果一个池在特定的一段时间内为得到公平的资源共享,它会中止运行池中得到过多资源的任务,以便把任务槽让给运行资源不足的池。 Fair Scheduler是一个后续模块,要使用它,需要将其JAR文件放在hadoop的类路径,即将它从contrib/ f airscheduler目录复制到lib目录。随后,像下面这样设置mapred.jobtracker.taskScheduler属性:org.apache.hadoop.mapred. FairScheduler。 经过这样的设置后,即可运行 Fair Scheduler。
Capacity Scheduler
集群由很多队列组成,类似于 Fair Scheduler的任务池,这些队列可能是层次结构的,每个队列有一个分配能力。只不过在队列内部,作业根据FIFO(优先级)方式进行调度。
Fair Scheduler vs Capacity Scheduler
(1) 相同点
- 均支持多用户多队列,即:适用于多用户共享集群的应用环境
- 单个队列均支持优先级和FIFO调度方式
- 均支持资源共享,即某个queue中的资源有剩余时,可共享给其他缺资源的queue
(2) 不同点
- 核心调度策略不同。 计算能力调度器的调度策略是,先选择资源利用率低的queue,然后在queue中同时考虑FIFO和memory constraint因素;而公平调度器仅考虑公平,而公平是通过作业缺额体现的,调度器每次选择缺额最大的job(queue的资源量,job优先级等仅用于计算作业缺额)。
- 内存约束。计算能力调度器调度job时会考虑作业的内存限制,为了满足某些特殊job的特殊内存需求,可能会为该job分配多个slot;而公平调度器对这种特殊的job无能为力,只能杀掉这种task。