大数据世界吧 关注:16,889贴子:123,206
  • 0回复贴,共1

技术干货 | MapReduce作业调度

只看楼主收藏回复

可以通过设置mapred.job.priority属性或JobClient的setJobPriority()方法来设置优先级(在这两种方法中,可以选VERY_HIGH,HIGH,NORMAL,LOW,VERY_LOW中的任何值作为优先级)。在作业调度器选择要运行的下一个作业时,选择的是优先级最高的作业。然而,在FIFO调度算法中,优先级并不支持抢占,所以高优先级的作业任然受阻于此前已经开始的,长时间运行的低优先级的作业。MR1的默认调度器是最初基于队列的FIFO调度器,还有两个多用户调度器,分别为公平调度器和容量调度器。

01
公平调度器
公平调度器的目标是让每个用户公平共享集群能力。如果只有一个作业在运行,就会得到集群的所有资源。随着提交的作业越来越多,闲置的任务槽会以“让每个用户公平共享集群”这种方式进行分配。某个用户的耗时短的作业将在合理的时间内完成,即便另一个用户的长时间作业正在运行而且还在运行过程中。
作业都放在作业池中,在默认情况下,每个用户都有自己的作业池。提交作业数较多的用户,不会因此而获得更多的集群资源。可以用map和reduce的任务槽数来定制作业池的最小容量,也可以设置每个池的权重。
公平调度器支持抢占机制,所以,如果一个池在特定的一段时间内未能公平共享资源,就会中止运行池中得到过多资源的任务,把空出来的任务槽让给运行资源不足的作业池。
公平调度器是一个后续模块。要使用它,需要将其JAR文件放在HADOOP的类路径,即将它从Hadoop的contrib/fairscheduler目录复制到lib目录。随后,像下面这样设置mapred.jobtracker.taskScheduler属性: org.apache.hadoop.mapred.FairScheduler
02
容量调度器
集群由很多队列组成(类似于公平调度器的任务池),这些队列可能是层次结构的(因此,一个队列可能是另一个队列的子队列),每个队列被分配有一定的容量。这一点与公平调度器类似,只不过在每个队列内部,作业根据FIFO方式(考虑优先级)进行调度。本质上,容量调度器允许用户或组织(使用队列进行定义)为每个用户或组织模拟出一个使用FIFO调度策略的独立MR集群。相比之下,公平调度器(实际上也支持作业池内的FIFO作业调度,使其类似于容量调度器)强制每个池内公平共享,使运行的作业共享池的资源。


1楼2018-01-09 16:50回复