为什么要做这个?前面给集群分配的资源分配了多个队列,以及每个队列的资源配比和作业调度的优先级。如果多租户里面的每个都按照约定,各自往自己对应的队列里面提交作业,自然没有问题。但是如果用户熟悉capacity scheduler的操作和原理,也是可以占用别组的资源队列。所有有了capacity scheduler的acl设置。
yarn.scheduler.capacity.queue-mappings
指定用户和queue的映射关系。默认用户上来,不用指定queue参数就能直接到对应的queue。这个比较方便,参数的格式为:<code>[u|g]:[name]:[queue_name][,next mapping]*</code>
yarn.scheduler.capacity.root.{queue-path}.acl_administer_queue
指定谁能管理这个队列里面的job,英文解释为<code>the acl of who can administer jobs on the default queue.</code> 星号<code>*</code>表示all,一个空格表示none;
yarn.scheduler.capacity.root.{queue-path}.acl_submit_applications
指定谁能提交job到这个队列,英文解释是<code>the acl of who can administer jobs on the queue.</code>星号<code>*</code>表示all,一个空格表示none;
创建emr集群
修改相关配置来支持queue acl
yarn-site: <code>yarn.acl.enable=true</code>
mapred-site: <code>mapreduce.cluster.acls.enabled=true</code>
hdfs-site: <code>dfs.permissions.enabled=true</code>这个跟capacity scheduler queue的acl没什么关系,是控制hdfs acl的,这里一并设置了
hdfs-site: <code>mapreduce.job.acl-view-job=*</code> 如果配置了<code>dfs.permissions.enabled=true</code>,就需要配置一下这个,要不然在hadoop ui上面没发查看job信息
重启yarn和hdfs,使配置生效(root账户)
<code>su -l hdfs -c '/usr/lib/hadoop-current/sbin/stop-dfs.sh'</code>
<code>su -l hadoop -c '/usr/lib/hadoop-current/sbin/stop-yarn.sh'</code>
<code>su -l hdfs -c '/usr/lib/hadoop-current/sbin/start-dfs.sh'</code>
<code>su -l hadoop -c '/usr/lib/hadoop-current/sbin/start-yarn.sh'</code>
<code>su -l hadoop -c '/usr/lib/hadoop-current/sbin/yarn-daemon.sh start proxyserver'</code>
修改capacity scheduler配置
完整配置
上面的配置,分配了三个队列和对应的资源配比,设置用户hadoop默认(不指定队列的时候)往b队列提,root默认往a队列提。同时hadoop只能往b队列提交作业,root可以往所有队列提交作业。其它用户没有权限提交作业。
acl_administer_queue的配置
配置中支持两种操作的acl权限配置<code>acl_administer_queue</code>和<code>acl_submit_applications</code>。按照语意,如果要控制是否能提交作业,只要配置队列的<code>acl_submit_applications</code>属性即可,按照文档,也就是这个意思。但是其实不是的,只要有administer权限的,就能提交作业。这个问题查了好久,找源码才找到。
root queue的配置
如果要限制用户对queue的权限root queue一定要设置,不能只设置leaf queue。因为权限是根权限具有更高的优先级,看代码注释说:<code>// recursively look up the queue to see if parent queue has the permission</code>。这个跟常人理解也b不一样。所以需要先把把的权限限制住,要不然配置的各种自队列的权限根本没有用。