YARN的授權根據授權實體,可以分為服務等級的授權、隊列層級的授權。

服務等級的授權

詳見Hadoop官方文檔

  • 控制特定使用者訪問叢集服務,如提交作業。
  • 配置在hadoop-policy.xml。
  • 服務等級的許可權校正在其他許可權校正之前(如HDFS的permission檢查/yarn提交作業到隊列控制)。
说明 一般設定了HDFS permission檢查/yarn隊列資源控制,可以不設定服務等級的授權控制,使用者可以根據自己需求進行相關配置。

隊列層級的授權

YARN可以通過隊列對資源進行授權管理,有兩種隊列調度 Capacity Scheduler和Fair Scheduler。

這裡以Capacity Scheduler為例。

  • 添加配置

    隊列也有兩個層級的授權,一個是提交作業到隊列的授權,一個是管理隊列的授權。

    说明
    • 隊列的ACL的控制對象為user/group,設定相關參數時,user和group可同時設定,中間用空格分開,user/group內部可用逗號分開,只有一個空格表示任何人都沒有許可權。
    • 隊列ACL繼承: 如果一個user/group可以向某個隊列中提交應用程式,則它可以向它的所有子隊列中提交應用程式,同理管理隊列的ACL也具有繼承性。所以如果要防止某個user/group提交作業到某個隊列,則需要設定該隊列以及該隊列的所有父隊列的ACL來限制該user/group的提交作業的許可權。
    • yarn.acl.enable

      ACL開關,設定為true

    • yarn.admin.acl
      • yarn的管理員設定,如可執行yarn rmadmin/yarn kill等命令,該值必須配置,否則後續的隊列相關的acl管理員設定無法生效。
      • 如上備忘,配置值時可以設定user/group:
        user1,user2 group1,group2 #user和group用空格隔開
          group1,group2 #只有group情況下,必須在最前面加上空格
        EMR叢集中需將has配置為admin的acl許可權
    • yarn.scheduler.capacity.${queue-name}.acl_submit_applications
      • 設定能夠向該隊列提交的user/group。
      • 其中${queue-name}為隊列的名稱,可以是多級隊列,注意多級情況下的ACL繼承機制。如:
        #queue-name=root
          <property>
              <name>yarn.scheduler.capacity.root.acl_submit_applications</name>
              <value> </value> #空格表示任何人都無法往root隊列提交作業
          </property>
         #queue-name=root.testqueue
         <property>
           <name>yarn.scheduler.capacity.root.testqueue.acl_submit_applications</name>
              <value>test testgrp</value> #testqueue只允許test使用者/testgrp組提交作業
          </property>
    • yarn.scheduler.capacity.${queue-name}.acl_administer_queue
      • 設定某些user/group管理隊列,比如kill隊列中作業等。
      • queue-name可以是多級,注意多級情況下的ACL繼承機制。
        #queue-name=root
          <property>
              <name>yarn.scheduler.capacity.root.acl_administer_queue</name>
              <value> </value>
          </property>
         #queue-name=root.testqueue
         <property>
           <name>yarn.scheduler.capacity.root.testqueue.acl_administer_queue</name>
              <value>test testgrp</value>
          </property>
  • 重啟YARN服務
    • 對於Kerberos安全叢集已經預設開啟ACL,使用者可以根據自己需求配置隊列的相關ACL許可權控制。
    • 對於非Kerberos安全叢集根據上述開啟ACL並配置好隊列的許可權控制,重啟YARN服務。
  • 配置樣本
    • yarn-site.xml
      <property>
              <name>yarn.acl.enable</name>
              <value>true</value>
       </property>
      <property>
              <name>yarn.admin.acl</name>
              <value>has</value>
       </property>
    • capacity-scheduler.xml
    • default隊列: 禁用default隊列,不允許任何使用者提交或管理。
    • q1隊列: 只允許test使用者提交作業以及管理隊列(如kill)。
    • q2隊列: 只允許foo使用者提交作業以及管理隊列。
    <configuration>
        <property>
            <name>yarn.scheduler.capacity.maximum-applications</name>
            <value>10000</value>
            <description>Maximum number of applications that can be pending and running.</description>
        </property>
        <property>
            <name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
            <value>0.25</value>
            <description>Maximum percent of resources in the cluster which can be used to run application masters i.e.
                controls number of concurrent running applications.
            </description>
        </property>
        <property>
            <name>yarn.scheduler.capacity.resource-calculator</name>
            <value>org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator</value>
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.queues</name>
            <value>default,q1,q2</value>
            <!-- 3個隊列-->
            <description>The queues at the this level (root is the root queue).</description>
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.default.capacity</name>
            <value>0</value>
            <description>Default queue target capacity.</description>
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.default.user-limit-factor</name>
            <value>1</value>
            <description>Default queue user limit a percentage from 0.0 to 1.0.</description>
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
            <value>100</value>
            <description>The maximum capacity of the default queue.</description>
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.default.state</name>
            <value>STOPPED</value>
            <!-- default隊列狀態設定為STOPPED-->
            <description>The state of the default queue. State can be one of RUNNING or STOPPED.</description>
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.default.acl_submit_applications</name>
            <value> </value>
            <!-- default隊列禁止提交作業-->
            <description>The ACL of who can submit jobs to the default queue.</description>
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.default.acl_administer_queue</name>
            <value> </value>
            <!-- 禁止管理default隊列-->
            <description>The ACL of who can administer jobs on the default queue.</description>
        </property>
        <property>
            <name>yarn.scheduler.capacity.node-locality-delay</name>
            <value>40</value>
        </property>
        <property>
            <name>yarn.scheduler.capacity.queue-mappings</name>
            <value>u:test:q1,u:foo:q2</value>
            <!-- 隊列映射,test使用者自動對應到q1隊列-->
            <description>A list of mappings that will be used to assign jobs to queues. The syntax for this list is
                [u|g]:[name]:[queue_name][,next mapping]* Typically this list will be used to map users to queues,for
                example, u:%user:%user maps all users to queues with the same name as the user.
            </description>
        </property>
        <property>
            <name>yarn.scheduler.capacity.queue-mappings-override.enable</name>
            <value>true</value>
            <!-- 上述queue-mappings設定的映射,是否覆蓋用戶端設定的隊列參數-->
            <description>If a queue mapping is present, will it override the value specified by the user? This can be used
                by administrators to place jobs in queues that are different than the one specified by the user. The default
                is false.
            </description>
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.acl_submit_applications</name>
            <value> </value>
            <!-- ACL繼承性,父隊列需控制住許可權-->
            <description>
                The ACL of who can submit jobs to the root queue.
            </description>
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.q1.acl_submit_applications</name>
            <value>test</value>
            <!-- q1隻允許test使用者提交作業-->
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.q2.acl_submit_applications</name>
            <value>foo</value>
            <!-- q2隻允許foo使用者提交作業-->
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.q1.maximum-capacity</name>
            <value>100</value>
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.q2.maximum-capacity</name>
            <value>100</value>
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.q1.capacity</name>
            <value>50</value>
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.q2.capacity</name>
            <value>50</value>
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.acl_administer_queue</name>
            <value> </value>
            <!-- ACL繼承性,父隊列需控制住許可權-->
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.q1.acl_administer_queue</name>
            <value>test</value>
            <!-- q1隊列只允許test使用者管理,如kill作業-->
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.q2.acl_administer_queue</name>
            <value>foo</value>
            <!-- q2隊列只允許foo使用者管理,如kill作業-->
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.q1.state</name>
            <value>RUNNING</value>
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.q2.state</name>
            <value>RUNNING</value>
        </property>
    </configuration>