Hadoop教程

作业的调度

早期版本的Hadoop使用一种非常简单的方法来调度用户的作业:按照作业提交的 顺序,使用FIFO(先进先出)调度算法来运行作业。典型情况下,毎个作业都会使 用整个集群,因此作业必须等待直到轮到自己运行。虽然共享集群极有可能为多用 户提供大量资源,但问题在于如何公平地在用户之间分配资源,这需要一个更好的调度器。生产作业需要及时完成,以便正在进行即兴查询的用户能够在合理的时 间内得到返回结果。

随后,加入设置作业优先级的功能,可以通过设置mapred.job.priority属性或JobClient的setJobPriority()方法来设置优先级(在这两种方法中,可以选择 VERY_HIGH, HIGH, NORMAL, LOW, VERY_LOW中的一个值作为优先级)。作业调度 器选择要运行的下一个作业时,它选择的是优先级最高的那个作业。然而,在 FIFO调度算法中,优先级并不支持抢占(preemption),所以髙优先级的作业仍然会 被那些在髙优先级作业被调度之前已经开始的、长时间运行的低优先级的作业 所阻塞。

在Hadoop中,MapReduce的调度器可以选择。默认的调度器是原始的基于队列 的FIFO调度器,还有两个多用户调度器,分别名为Fair Scheduler和Capacity Scheduler。

Fair Scheduler

Fair Scheduler(公平调度器)的目标是让每个用户公平地共享集群能力。如果只有一 个作业在运行,它会得到集群的所有资源。随着提交的作业越来越多,空闲的任务 槽会以‘‘让每个用户公平共享集群”这种方式进行分配。某个用户的一个短的作业 将在合理的时间内完成,即便另一个用户的长时间作业正在运行而且还在运行过 程中。

作业都被放在作业池中,在默认情况下,每个用户都有自己的作业池。提交作业数 超过另一个用户的用户,不会因此而比后者获得更多集群资源。可以用map和reduce的任务槽数来定制作业池的最小容量,也可以设置每个池的权重。

Fair Scheduler支持抢占,所以,如果一个池在特定的一段时间内未得到公平的资 源共享,它会中止运行池中得到过多资源的任务,以便把任务槽让给运行资源不足的池。

Fair Scheduler是一个后续模块。要使用它,需要将其JAR文件放在Hadoop的类 路径(classpath),即将它从Hadoop的contrib/fairscheduler目录复制到lib目录。随 后,像下面这样设置 mapred.jobtracker.taskScheduler 属性:

org.apache.hadoop.mapred.FairScheduler

经过这样的设置后,即可运行Fair Scheduler。但要想充分发挥它特有的优势和了 解如何配置它(包括它的网络接口),请参阅Hadoop发行版src/cqntrib/fairscheduler 目录下的README文件。


Capacity Scheduler

针对多用户调度,Capacity Scheduler采用的方法稍有不同。集群由很多队列组成 (类似于Fair Scheduler的任务池,这些队列可能是层次结构的(因此,一个队列可 能是另一个队列的孩子),每个队列有一个分配能力。这一点与Fair Scheduler类 似,只不过在每个队列内部,作业根据FIFO方式(优先级)进行调度。本质上, Capacity Scheduler允许用户或组织(使用队列进行定义)为每个用户或组织模拟一 个独立的使用 FIFO Scheduling 的 MapReduce 集群。相比之下,Fair Scheduler(实际上支持[优先级]作业池内的FIFO作业调度,使其类似于能力调度)强制每个池内 公平共享,使运行的作业共享池的资源。

关注微信获取最新动态