YARN 認証はサービスレベル認証とキューレベル認証に分けられます。

サービスレベル認証

詳しくは、Hadoop の『サービスレベル認証ガイド』をご参照ください。

  • ジョブの送信など、ユーザーによるクラスターサービスへのアクセスを制御します。
  • hadoop-policy.xml を設定します。
  • サービスレベル権限のチェックは他の権限のチェック (HDFS の権限のチェックや YARN ジョブ送信など) の前に実行されます。
通常、HDFS の権限のチェックや YARN ジョブ送信制御がセットアップされている場合は、サービスレベル権限制御を設定しない可能性があります。必要に応じて関連する設定を実行します。

キューレベル認証

YARN ではキューによるリソースの権限の制御がサポートされています。Capacity Scheduler と Fair Scheduler の 2 つのキュースケジューリング方法が提供されます。ここでは例として Capacity Scheduler を使用します。

  • 設定の追加

    キューにはジョブ送信権限 (キューへのジョブの送信) とキュー管理権限の 2 段階のレベルの認証があります。

    • キューの ACL 制御オブジェクトは ユーザーまたはグループです。関連パラメーターを定義するときは、スペースで区切ってユーザーとグループを同時に設定します。 異なるユーザーまたはグループはコンマで区切ります。スペースが 1 つだけ設定されている場合は、誰にも権限がありません。
    • キューの ACL 継承については、ユーザーまたはグループがキューにアプリケーションを送信する場合は、すべてのサブキューにもアプリケーションを送信します。キューを管理する ACL も継承されます。ユーザーまたはグループによるキューの送信を防ぐには、このキューとすべての親キューの ACL を設定し、ユーザーまたはグループに対してジョブ送信権限を制限する必要があります。
    • yarn.acl.enable

      ACL を true に切り替えます。

    • yarn.admin.acl
      • yarn rmadmin/yarn kill やその他のコマンドの実行を有効化または無効化するための、YARN 管理者の設定です。 この値を設定する必要があります。 設定しない場合は、次のキューベースの ACL 管理者の設定は有効になりません。
      • パラメーターの値を設定するときにユーザーまたはグループを設定します。
        user1,user2 group1,group2 #users and groups are separated by a space
          group1,group2 #In case there are only groups, a leading space is required.
        E-MapReduce クラスターで、管理者としてundefinedhasに ACL 権限を設定する必要があります。
    • yarn.scheduler.capacity.${queue-name}.acl_submit_applications
      • キューにジョブを送信するユーザーまたはグループを設定します。
      • ${queue-name} がキュー名の場合は、階層キューがサポートされます。 ACL が階層キューで継承されることに注意します。以下の例をご参照ください。
        #queue-name=root
          <property>
              <name>yarn.scheduler.capacity.root.acl_submit_applications</name>
              <value> </value> # Space means no one can submit jobs to the root queue
          </property>
         #queue-name=root.testqueue
         <property>
           <name>yarn.scheduler.capacity.root.testqueue.acl_submit_applications</name>
              <value>test testgrp</value> #testqueue only allows the test user and testgrp group to submit jobs
          </property>
    • yarn.scheduler.capacity.${queue-name}.acl_administer_queue
      • キュー内のジョブを強制終了するなど、キューを管理するためのユーザーまたはグループを設定します。
      • 階層キュー名がサポートされています。 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 ユーザーのみがジョブの送信またはキューの管理 (ジョブの強制終了など) を許可されます。
    • 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 queues->
            <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>
            <! -- Status of the default queue is set as 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>
            <! -- The default queue does not allow job submission-->
            <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>
            <! -- Prevent users/groups to manage the default queue-->
            <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>
            <! -- Queue mapping, automatically maps the test user to Q1 queue-->
            <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>
            <! -- Whether or not allow the above queue-mapping to overwrite the queue parameters set up by the client-->
            <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 inheritance, the parent queue must have the admin permissions-->
            <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 only allows the test user to submit jobs-->
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.q2.acl_submit_applications</name>
            <value>foo</value>
            <! -- q2 only allows the foo user to submit jobs-->
        </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 inheritance, the parent queue must have the admin permissions-->
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.q1.acl_administer_queue</name>
            <value>test</value>
            <! -- q1 only allow the test user to manage the queue, such as killing the jobs-->
        </property>
        <property>
            <name>yarn.scheduler.capacity.root.q2.acl_administer_queue</name>
            <value>foo</value>
            <! -- q2 only allow the foo user to manage the queue, such as killing the jobs-->
        </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>