Maison > Article > base de données > Hadoop层级队列组织方式
作者: Dong | 新浪微博: 西成懂 | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明 网址:http://dongxicheng.org/mapreduce/hadoop-hierarchy-queues/ 在Hadoop 0.20.x版本或者更早的版本,Hadoop采用了平级队列组织方式,在这种组织方
作者:Dong | 新浪微博:西成懂 | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
网址:http://dongxicheng.org/mapreduce/hadoop-hierarchy-queues/
在Hadoop 0.20.x版本或者更早的版本,Hadoop采用了平级队列组织方式,在这种组织方式中,管理员可将用户分到若干个扁平队列中,在每个队列中,可指定一个或几个队列管理员管理这些用户,比如杀死任意用户的作业,修改任意用户作业的优先级。然而,从资源管理角度看,仅仅按照队列组织用户是不够的,还需要将资源划分到这几个队列中,并按照一定的策略完成资源分配,这就需要Hadoop作业调度器的支持。总之,在Hadoop中,队列的组织是队列管理和资源分配的基础。
随着Hadoop应用越来越广泛,有用户提出需支持层级队列组织方式。典型的应用场景如下:在一个Hadoop集群中,管理员将所有计算资源划分给了若干个队列,每个队列对应了一个“组织”,其中有一个组织“Org1”,它分到了60%的资源,它内部包含3中类型的作业:
(1)产品线作业
(2)实验性作业—分属于三个不用的项目:Proj1,Proj2和Proj3
(3)其他类型作业
Org1管理员想更有效地控制这60%资源,比如将大部分资源分配给产品线作业的同时,能够让实验性作业和其他类型作业有最少资源保证。考虑到产品线作业提交频率很低,当有产品线作业提交时,必须第一时间得到资源,剩下的资源才给其他类型的作业,然而,一旦产品线作业运行结束,实验性作业和其他类型作业必须马上获取未使用的资源,一个可能的配置方式如下:
grid { Org1 min=60% { priority min=90% { production min=82% proj1 min=6% max=10% proj2 min=6% proj3 min=6% } miscellaneous min=10% } Org2 min=40% }
这就引出来层级队列组织方式。
(1) 子队列
1)? 队列可以嵌套,每个队列均可以包含子队列。
2)? 用户只能将作业提交到最底层的队列,即叶子队列。
(2)最少容量
1)每个子队列均有一个“最少容量比”属性,表示可以使用父队列的容量的百分比
2)调度器总是优先选择当前资源使用率最低的队列,并为之分配资源。比如同级的两个队列Q1和Q2,他们的最少容量均为30,而Q1已使用10,Q2已使用12,则调度器会优先将资源分配给Q1。
3)最少容量不是“总会保证的最低容量”,也就是说,如果一个队列的最少容量为20,而该队列中所有队列仅使用了5,那么剩下的15可能会分配给其他需要的队列。
4)最少容量的值为不小于0的数,但也不能大于“最大容量”。
(3) 最大容量
1)? 为了防止一个队列超量使用资源,可以为队列设置一个最大容量,这是一个资源使用上限,任何时刻使用的资源总量不能超过该值。
2) 默认情况下队列的最大容量是无限大,这意味着,当一个队列只分配了20%的资源,所有其他队列没有作业时,该队列可能使用100%的资源,当其他队列有作业提交时,再逐步归还。
如何将一个队列中的资源分配给它的各个子队列?
当一个TaskTracker发送心跳请求一个新任务时,调度器会按照以下策略为之选择任务:
1)? 按照 比值{used capacity}/{minimum-capaity},对所有子队列排序;
2)? 选择一个比值{used capacity}/{minimum-capaity}最小的队列:
如果是一个叶子队列,且有处于pending状态的任务,则选择一个任务(不能超过maximum capacity);
否则,递归地从这个队列的子队列中选择任务。
3)? 如果没有找到任务,则查看下一个队列。
层级队列组织方式在 0.21.x和0.22.x中引入,但仅有Capacity Scheduler支持该组织方式(https://issues.apache.org/jira/browse/MAPREDUCE-824 ),当然,最新的YARN(Hadoop 0.23.x和2.0.x-alpha)也为Fair Scheduler增加了层级队列的支持,具体参考:https://issues.apache.org/jira/browse/YARN-187。
如何配置?
以0.21.x为例,管理员可在配置文件mapred-queues.xml中配置层级队列,配置方式如下:
<queues> <queue> <name>Org1</name> <queue> <name>production</name> <properties> <property key="”capacity”" value="”20″/"> <property key="”" maximum-capacity value="”20″/"> <property key="”supports-priority”" value="”true”/"> <property key="”minimum-user-limit-percent”" value="”30″/"> <property key="”maximum-initialized-jobs-per-user”" value="”10″/"> <property key="”user-limit”" value="”30″/"> </property></property></property></property></property></property></properties> </queue> <queue> <name>miscellaneous</name> <properties> <property key="”capacity”" value="”10″/"> <property key="”" maximum-capacity value="”20″/"> <property key="”user-limit”" value="”20″/"> </property></property></property></properties> </queue> 。。。。。。。 </queue></queues>
管理员可在capacity-scheduler.xml中设置一些参数的默认值和Capacity独有的配置:
<configuration> <property> <name>mapred.capacity-scheduler.default-supports-priority</name> <value>false</value> </property> <property> <name>mapred.capacity-scheduler.default-minimum-user-limit-percent</name> <value>100</value> </property> <property> <name>mapred.capacity-scheduler.default-maximum-initialized-jobs-per-user</name> <value>2</value> </property> <property> <name>mapred.capacity-scheduler.init-poll-interval</name> <value>5000</value> </property> <property> <name>mapred.capacity-scheduler.init-worker-threads</name> <value>5</value> </property> </configuration>
原创文章,转载请注明: 转载自董的博客
本文链接地址: http://dongxicheng.org/mapreduce/hadoop-hierarchy-queues/
作者:Dong,作者介绍:http://dongxicheng.org/about/