hadoop计算能力调度器配置

[size=x-large]问题出现[/size]
hadoop默认调度器是FIFO,其原理就是先按照作业的优先级高低,再按照到达时间的先后选择被执行的作业。
比如有两个作业job1和job2,job1提交了一个优先级比较高的作业,而且独占资源时间特别长,这时候来了一个job2作业,就需要等待job1完成释放后才能执行。
[size=x-large]解决方法[/size]
hadoop有facebook贡献的一个计算能力调度器(Capacity Scheduler), 支持多个队列,每个队列可配置一定的资源量,每个队列采用FIFO调度策略,为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。调度时,首先按以下策略选择一个合适队列:计算每个队列中正在运行的任务数与其应该分得的计算资源之间的比值,选择一个该比值最小的队列;然后按以下策略选择该队列中一个作业:按照作业优先级和提交时间顺序选择,同时考虑用户资源量限制和内存限制。

修改hadoop的配置文件mapred-site.xml:

<property>
<name>mapred.jobtracker.taskScheduler</name>
<value>org.apache.hadoop.mapred.CapacityTaskScheduler</value>
<description>计算能力调度器实现类</description>
</property>
<property>
<name>mapred.queue.names</name>
<value>default,hive,pig</value>
<description>队列名称</description>
</property>


在capacity-scheduler.xml文件中填写如下内容:


<property>
<name>mapred.capacity-scheduler.queue.hive.capacity</name>
<value>40</value>
<description>队列容量</description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.hive.maximum-capacity</name>
<value>-1</value>
<description>队列的资源使用上限(百分比)</description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.hive.supports-priority</name>
<value>true</value>
<description></description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.hive.minimum-user-limit-percent</name>
<value>100</value>
<description>t:每个用户最低资源保障(百分比)</description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.hive.user-limit-factor</name>
<value>3</value>
<description>设置queue中用户可占用queue容量的系数,默认为1</description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.hive.maximum-initialized-active-tasks</name>
<value>200000</value>
<description></description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.hive.maximum-initialized-active-tasks-per-user</name>
<value>100000</value>
<description></description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.hive.init-accept-jobs-factor</name>
<value>10</value>
<description></description>
</property>

<!-- pig -->
<property>
<name>mapred.capacity-scheduler.queue.pig.capacity</name>
<value>30</value>
<description></description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.pig.maximum-capacity</name>
<value>-1</value>
<description></description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.pig.supports-priority</name>
<value>true</value>
<description>If true, priorities of jobs will be taken into
account in scheduling decisions.
</description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.pig.minimum-user-limit-percent</name>
<value>100</value>
<description></description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.pig.user-limit-factor</name>
<value>4</value>
<description>The multiple of the queue capacity which can be configured to
allow a single user to acquire more slots.
</description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.pig.maximum-initialized-active-tasks</name>
<value>200000</value>
<description></description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.pig.maximum-initialized-active-tasks-per-user</name>
<value>100000</value>
<description></description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.pig.init-accept-jobs-factor</name>
<value>10</value>
<description></description>
</property>

<!-- default -->
<property>
<name>mapred.capacity-scheduler.queue.default.capacity</name>
<value>30</value>
<description></description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.default.maximum-capacity</name>
<value>-1</value>
<description></description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.default.supports-priority</name>
<value>true</value>
<description></description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.default.minimum-user-limit-percent</name>
<value>100</value>
<description></description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.default.user-limit-factor</name>
<value>4</value>
<description></description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.default.maximum-initialized-active-tasks</name>
<value>200000</value>
<description></description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.default.maximum-initialized-active-tasks-per-user</name>
<value>100000</value>
<description></description>
</property>

<property>
<name>mapred.capacity-scheduler.queue.default.init-accept-jobs-factor</name>
<value>10</value>
<description></description>
</property>



mapred.capacity-scheduler.queue.<queue-name>.user-limit-factor:设置queue中用户可占用queue容量的系数,默认为1表示,queue中每个用户最多只能占有queue的容量(即mapred.capacity-scheduler.queue.<queue-name>.capacity),因此,需要注意的是,如果queue中只有一个用户提交job,且希望用户在集群不繁忙时候可扩展到mapred.capacity-scheduler.queue.<queue-name>.maximum-capacity指定的slots数,则必须相应调大user-limit-factor这个系数。

[size=x-large]java中的使用[/size]

conf.setQueueName("hive");



[size=x-large]动态更新集群队列和容量[/size]
生产环境中,队列及其容量的修改在现实中是不可避免的,而每次修改,需要重启集群,这个代价很高,如果修改队列及其容量的配置不重启呢:
1.在主节点上根据具体需求,修改好mapred-site.xml和capacity-scheduler.xml
2.把配置同步到所有节点上
3.使用hadoop用户执行命令:hadoop mradmin -refreshQueues
这样就可以动态修改集群的队列及其容量配置,不需要重启了,刷新mapreduce的web管理控制台可以看到结果。

注意:如果配置没有同步到所有的节点,一些队列会无法启用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
公平调度是一种赋予作业(job)资源的方法,它的目的是让所有的作业随着时间的推移, 都能平均的获取等同的共享资源。当单独一个作业在运行时,它将使用整个集群。当有其它 作业被提交上来时,系统会将任务(task)空闲时间片(slot)赋给这些新的作业,以使得每 一个作业都大概获取到等量的 CPU 时间。与 Hadoop 默认调度维护一个作业队列不同,这 个特性让小作业在合理的时间内完成的同时又不“饿”到消耗较长时间的大作业。它也是一 个在多用户间共享集群的简单方法。公平共享可以和作业优先权搭配使用——优先权像权重 一样用作为决定每个作业所能获取的整体计算时间的比例。 公平调度按资源池(pool)来组织作业,并把资源公平的分到这些资源池里。默认情况 下,每一个用户拥有一个独立的资源池,以使每个用户都能获得一份等同的集群资源而不管 他们提交了多少作业。按用户的 Unix 群组或作业配置(jobconf)属性来设置作业的资源池也 是可以的。在每一个资源池内,会使用公平共享(fair sharing)的方法在运行作业之间共享容 量(capacity)。 你也可以给予资源池相应的权重,以不按比例的方式共享集群。 除了提供公平共享方法外,公平调度允许赋给资源池保证(guaranteed)最小共享资源, 这个用在确保特定用户、群组或生产应用程序总能获取到足够的资源时是很有用的。当一个 资源池包含作业时,它至少能获取到它的最小共享资源,但是当资源池不完全需要它所拥有 的保证共享资源时,额外的部分会在其它资源池间进行切分。 在常规操作中,当提交了一个新作业时,公平调度会等待已运行作业中的任务完成以 释放时间片给新的作业。但,公平调度也支持在可配置的超时时间后对运行中的作业进行 抢占。如果新的作业在一定时间内还获取不到最小的共享资源,这个作业被允许去终结已运 行作业中的任务以获取运行所需要的资源。因此抢占可以用来保证“生产”作业在指定时间 内运行的同时也让Hadoop 集群能被实验或研究作业使用。另外,作业的资源在可配置的超时 时间(一般设置大于最小共享资源超时时间)内拥有不到其公平共享资源(fair share)的一半 的时候也允许对任务进行抢占。在选择需要结束的任务时,公平调度会在所有作业中选择 那些最近运行起来的任务,以最小化被浪费的计算。抢占不会导致被抢占的作业失败,因为 Hadoop 作业能容忍丢失任务,这只是会让它们的运行时间更长。 最后,公平调度还可以限制每用户和每资源池的并发运行作业数量。当一个用户必须 一次性提交数百个作业时,或当大量作业并发执行时,用来确保中间数据不会塞满集群上的 磁盘空间,这是很有用的。设置作业限制会使超出限制的作业被列入调度的队列中进行等 待,直到一些用户/资源池的早期作业运行完毕。系统会根据作业优先权和提交时间的排列来 运行每个用户/资源池中的作业。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值