问题描述:

NDHmanager的yarn三级队列无法设置用户访问权限控制,查看开源文档,三级队列配置以下参数的方式无法生效

yarn.scheduler.capacity.queue-mappings

yarn.scheduler.capacity.queue-mappings-override.enable

yarn.scheduler.capacity.root..acl_submit_applications

三级队列配置后,任务提交到这个三级队列报错

FAQ-三级队列限定用户访问权限控制 - 图1

参数配置截图:

FAQ-三级队列限定用户访问权限控制 - 图2 FAQ-三级队列限定用户访问权限控制 - 图3

问题原因:

一、队列的两种解析方式:

提交任务主动设置队列名称mapreduce.job.queuename 的两种方式:

1、设置全路径:mapreduce.job.queuename = root.pro.test 那任务会自动提交到这个队列上运行

2、只设置叶子队列名称: mapreduce.job.queuename = test ,但这种方式需要保证叶子队列唯一。

第二种方式原理解析:

当用户设置提交任务的 mapreduce.job.queuename = test 时,yarn 的RM在处理任务提交信息前,在RM启动时已经通过用户配置的如下队列:

root.pro.default
root.pro.test
root.pro.sla
root.dev.defaul
root.dev.sla

生成如下的子队列到全路径队列的映射集合:

default=[root.pro.default, root.dev.default], 
test=[root.pro.test], 
dev=[root.dev],
sla=[root.dev.sla, root.pro.sla], 
pro=[root.pro]

当RM在处理用户提交任务时,如果设置队列的名称是叶子队列,就会通过判断上面集合里子队列名称对应的全路径队列名称是否唯一,如果唯一就可以确认具体提交的队列全称。如果不唯一或设置的队列非叶子队列则提交失败:Failed to submit to YARN : ambiguous queue: sla please use full queue path instead. 例如指定 mapreduce.job.queuename = sla 则会失败。 上面这两种方式对应在yarn页面上也会有所区别,只会显示设置的队列名称。如下所示: 主动设置的 mapreduce.job.queuename = root.pro.test 或 mapreduce.job.queuename = test ,设置test队列名称是对应的全路径队列名称唯一,都能正常提交,但页面显示不一样:

FAQ-三级队列限定用户访问权限控制 - 图4

二、配置三个参数后映射队列方式提交失败原因:

采用映射队列配置的方式而非用户提交任务指定队列时,如下所示,在用户配置队列的映射关系时,虽然设置了全路径,

<property>
    <name>yarn.scheduler.capacity.queue-mappings</name>
    <value>u:hdfs:root.pro.test</value>
</property>

但RM在处理这种提交方式类似使用了上面的第二种方式,只设置了叶子队列名称 mapreduce.job.queuename = test ,这就跟上面的第二种方式效果对上了,如果子队列重复则提交失败,但具体打印的错误不一样,页面也只会显示叶子队列,所以在当前版本要使用映射队列方式提交,要确保叶子队列唯一。

解决方法:

二级队列和三级队列不能重复