為什麼要做這個?前面給叢集配置設定的資源配置設定了多個隊列,以及每個隊列的資源配比和作業排程的優先級。如果多租戶裡面的每個都按照約定,各自往自己對應的隊列裡面送出作業,自然沒有問題。但是如果使用者熟悉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>。這個跟常人了解也不一樣。是以需要先把把的權限限制住,要不然配置的各種自隊列的權限根本沒有用。