队列的层次是通过嵌套<queue>
元素实现的。
所有的队列都是root
队列的孩子,即使我们没有配到<root>
元素里。
在这个配置中,我们把root
队列有分成了hdfs,spark和default三
个队列。
每个队列内部仍可以有不同的调度策略。
队列的默认调度策略可以通过顶级元素<defaultQueueSchedulingPolicy>
进行配置,如果没有配置,默认采用公平调度。
1.minResources :最少资源保证量,设置格式为“X mb, Y vcores”,当一个队列的最少资源保证量未满足时,
它将优先于其他同级队列获得资源,对于不同的调度策略(后面会详细介绍),最少资源保证量的含义不同,对于fair策略,则只考虑内存资源,
即如果一个队列使用的内存资源超过了它的最少资源量,则认为它已得到了满足;对于drf策略,则考虑主资源使用的资源量,
即如果一个队列的主资源量超过它的最少资源量,则认为它已得到了满足。
2.maxResources:最多可以使用的资源量,fair scheduler会保证每个队列使用的资源量不会超过该队列的最多可使用资源量。
3.maxRunningApps:最多同时运行的应用程序数目。通过限制该数目,可防止超量Map Task同时运行时产生的中间输出结果撑爆磁盘。
4.weight:队列间的权重值,当队列中有任务等待,并且集群中有空闲资源时候,每个队列可以根据权重获得不同比例的集群空闲资源。
5.schedulingPolicy:队列采用的调度模式,可以是fifo、fair或者drf。
6.aclSubmitApps:可向队列中提交应用程序的Linux用户或用户组列表,默认情况下为“*”,表示任何用户均可以向该队列提交应用程序。
需要注意的是,该属性具有继承性,即子队列的列表会继承父队列的列表。配置该属性时,用户之间或用户组之间用“,”分割,
用户和用户组之间用空格分割,比如“user1, user2 group1,group2”。
7.aclAdministerApps:该队列的管理员列表。一个队列的管理员可管理该队列中的资源和应用程序,比如可杀死任意应用程序。
8.minSharePreemptionTimeout:最小共享量抢占时间。如果一个资源池在该时间内使用的资源量一直低于最小资源量,则开始抢占其他队列的资源
1.User elements:为单个用户添加maxRunningApps属性限制其最多同时运行的应用程序数目
2.userMaxAppsDefault elements:其他用户最多同时运行的app数目的默认值
3.fairSharePreemptionTimeout elements:公平共享量抢占时间,如果一个队列在该时间内使用资源量一直低于公平共享量的一半
(这个比例可以配置,通过defaultFairSharePreemptionThreshold来配置默认比例,fairSharePreemptionThreshold配置该队列比例),
则开始抢占该队列的资源。
4.defaultMinSharePreemptionTimeout elements:队列的minSharePreemptionTimeout属性的默认值。
5.queueMaxAppsDefault elements:队列的maxRunningApps属性的默认值,会被队列的maxRunningApps属性覆盖。
6.defaultQueueSchedulingPolicy elements:队列的schedulingPolicy属性的默认值。
7.queuePlacementPolicy elements:基于规则来确定应用应该放到哪个队列,<queuePlacementPolicy> 元素定义了一个规则列表,
其中的每个规则会被逐个尝试直到匹配成功,至于它的规则官网上有写,这里就不写了。
配置如下:
<?xml version="1.0"?>
<allocations>
<queue name="root">
<defaultQueueSchedulingPolicy>drf</defaultQueueSchedulingPolicy>
<schedulingPolicy>drf</schedulingPolicy>
<queue name="hdfs">
<minResources>0 mb,0 vcores </minResources>
<maxResources>308020 mb,124 vcores </maxResources>
<maxRunningApps>100</maxRunningApps>
<minSharePreemptionTimeout>300</minSharePreemptionTimeout>
<weight>1.0</weight>
</queue>
<queue name="spark">
<minResources>0 mb,0 vcores </minResources>
<maxResources>154000 mb,128 vcores </maxResources>
<maxRunningApps>200</maxRunningApps>
<minSharePreemptionTimeout>300</minSharePreemptionTimeout>
<weight>4.0</weight>
<aclSubmitApps> long</aclSubmitApps>
<aclAdministerApps> long</aclAdministerApps>
</queue>
<queue name="default">
<minResources>0 mb,0 vcores </minResources>
<maxResources>308020 mb,124 vcores </maxResources>
<maxRunningApps>100</maxRunningApps>
<minSharePreemptionTimeout>300</minSharePreemptionTimeout>
<weight>1.0</weight>
</queue>
</queue>
</allocations>
说明: 此处只设置了一个资源池,但是有三个队列,限制了各个队列的大小,防止某个大任务占据了整个集群的资源,当有重要任务提交的时候,申请不到资源。
注意:
设置完成这些还是不够的,当用户通过指定队列启动作业,如果队列不存在,可以通过scheduler自动创建队列,可以进行进一步对
yarn.scheduler.fair.allow-undeclared-pools配置禁止scheduler自动创建队列。
参考
https://hadoop.apache.org/docs/r2.6.0/hadoop-yarn/hadoop-yarn-site/FairScheduler.html#Configuration
http://www.mamicode.com/info-detail-1097801.html
http://blog.csdn.net/LW_GHY/article/details/51737882