Pivotal Knowledge Base

フォローする

YARN capacity scheduler.xml を利用したキューの設定方法

環境

製品 バージョン
PHD 1.x、2.x 

目的

この記事では、YARN Capacity Schedulerを利用してキューを設定する際の、一通りの手順ついて言及する。

手順

事前準備

キューの設定前に、まず始めにどのようにYARN NodeManagerによって利用されるメモリの最大容量を設定できるのか見てみよう。PHDクラスタでYARN NodeManagerによる明示的なメモリ利用量を設定するには、yarnの設定ファイルである"/etc/gphd/hadoop/conf/yarn-site.xml"の"yarn.nodemanager.resource.memory-mb"の設定値を変更することで対応可能である。望ましい値を設定した後、変更内容を有効化するためにYARNサービスを再起動する必要がある。

yarn-site.xml
<property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>16384</value>
</property>

注意: 上記の例では、各サーバ毎のYARN NodeManagerに16GBのメモリを割り当てている。

1. ここで、実行する必要のある操作の要求に応じて複数のキューを生成し、それらに定義されたクラスタリソースを割り当てるかもしれない。しかしYARNがキャパシティスケジューラを利用するために yarn-site.xml 内の"yarn.resourcemanager.scheduler.class"を定義する必要がある。PHDの場合デフォルトではキャパシティスケジューラを利用するよう設定されているので、すぐにキューを定義することができる。

 yarn-site.xml
<property>
    <name>yarn.resourcemanager.scheduler.class</name>
 <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>

2. キューの設定:

キャパシティスケジューラはrootと呼ばれる事前に定義されたキューがある。システム内の全てのキューはrootキューの子キューである。capacity-scheduler.xml内での、パラメータの"yarn.scheduler.capacity.root.queues"は子キューを定義するために利用できる。例えば、3つのキューを作るには、キューの名前をカンマ区切りのリストで指定することで可能となる。

<property>
    <name>yarn.scheduler.capacity.root.queues</name>
    <value>alpha,beta,default</value>
    <description>
      The queues at the this level (root is the root queue).
    </description>
 </property>

3. 上記ような設定変更を行うことで、次にキュー固有のパラメータを指定することが可能となる。

注意:キュー固有のプロパティーを表すパラメータは、標準的な命名規則に従い、関連しているキューの名前が含まれている。

ここでは一般的な構文を例に挙げる : yarn.scheduler.capacity.<queue-path>.<parameter>
ただし以下を意味する:
<queue-path> : キューの名前を指定
<parameter>  : 値を設定しているパラメータを指定

設定可能な全パラメータ一覧に関しては、Apache Yarn Capacity Scheduler のドキュメントを参照すること。

4. パラメータの設定

1) キューリソースの割当に関するキューパラメータ:

yarn.scheduler.capacity.<queue-path>.capacity
これらのリソースに割当られなければいけないクラスタリソースの割合を設定するためには、capacity-scheduler.xml 内の yarn.scheduler.capacity.<queue-path>.capacity パラメータ値を各々編集する必要がある。

下記の例では、先にNodeManager 1つあたり "yarn.nodemanager.resource.memory-mb" に設定して割り当てたクラスタリソースのうち、各キューに対して使用率が50%、30%、20%となるように設定している。

 <property>
    <name>yarn.scheduler.capacity.root.alpha.capacity</name>
    <value>50</value>
    <description>Default queue target capacity.</description>
  </property>

<property>
    <name>yarn.scheduler.capacity.root.beta.capacity</name>
    <value>30</value>
    <description>Default queue target capacity.</description>
  </property>

<property>
    <name>yarn.scheduler.capacity.root.default.capacity</name>
    <value>20</value>
    <description>Default queue target capacity.</description>
  </property>

2) キューの管理と権限に関するパラメータ: 

a) yarn.scheduler.capacity.<queue-path>.state
キューを経由してジョブやアプリケーションを投入できるようにするには、キューの状態がRUNNINGである必要がある。さもないと、そのキューの状態がSTOPPEDである旨のエラーメッセージを受け取ることになろう。RUNNINGとSTOPPEDはこのパラメータに設定可能な値である。

以下例を示す:

  <property>
    <name>yarn.scheduler.capacity.root.alpha.state</name>
    <value>RUNNING</value>
    <description>
      The state of the default queue. State can be one of RUNNING or STOPPED.
    </description>
  </property>

<property>
   <name>yarn.scheduler.capacity.root.beta.state</name>
    <value>RUNNING</value>
    <description>
      The state of the default queue. State can be one of RUNNING or STOPPED.
    </description>
  </property>

<property>
    <name>yarn.scheduler.capacity.root.default.state</name>
    <value>RUNNING</value>
    <description>
      The state of the default queue. State can be one of RUNNING or STOPPED.
    </description>
  </property>

b) yarn.scheduler.capacity.root.<queue-path>.acl_submit_applications 
特定のユーザが指定したキューにジョブやアプリケーションの投入を許可するために、カンマ区切りのリストでユーザとグループを定義する必要がある。特別な値として * を指定すると、全てのユーザーに対して当該キューへのジョブやアプリケーションの投入を許可する。

特定のユーザリストを指定するフォーマット例:

1) <value>user1,user2</value> : user1、user2が許可されることを示す
2) <value>user1,user2 group1,group2</value> : user1、user2 そして group1と group2に属するユーザが許可されることを示す
3) <value>group1,group2</value>: group1とgroup2に属するユーザが許可されることを示す

このパラメータ設定の元、最初に設定すべきことは、当該パラメーターの値として、非リーフrootキューに対して"hadoop,yarn,mapped,hdfs"を定義することである。それにより、当該特殊ユーザーのみが全てのキューを使えることを保証する。

子キューはrootキューの権限を継承しており、デフォルトの権限は "*" が設定されているため、rootキューにあるリストを制限しない場合には、すべてのユーザーが任意のキューでジョブを実行できる可能性がある。非リーフrootキューに対し"hadoop,yarn,mapped,hdfs"を指定することで、特定の子キューに基づくユーザアクセスを制御することができる。

c) 非リーフrootキュー: 

 <property>
    <name>yarn.scheduler.capacity.root.acl_submit_applications</name>
    <value>hadoop,yarn,mapred,hdfs</value>
    <description>
      The ACL of who can submit jobs to the root queue.
    </description>
  </property>

d) rootキュー配下の子キュー / リーフ子キュー : 

<property>
   <name>yarn.scheduler.capacity.root.alpha.acl_submit_applications</name>
   <value>sap_user hadoopusers</value>      <description>
      The ACL of who can submit jobs to the alpha queue.
    </description>
  </property>

<property>
    <name>yarn.scheduler.capacity.root.beta.acl_submit_applications</name>
    <value>bi_user,etl_user failgroup</value>
    <description>
      The ACL of who can submit jobs to the beta queue.
    </description>
  </property>

  <property>
    <name>yarn.scheduler.capacity.root.default.acl_submit_applications</name>
    <value>adhoc_user hadoopusers</value>
    <description>
      The ACL of who can submit jobs to the default queue.
    </description>
  </property>

e) yarn.scheduler.capacity.<queue-path>.acl_administer_queue
キュー上でアプリケーションを管理することができる管理者のリストを設定するには、このパラメータにカンマ区切りのリストでユーザ名を設定することになる。 特別な値である * を設定すると、全てのユーザがキュー上で実行中のアプリケーションの管理を実行可能となる。

acl_submit_applicationsで定義したように、以下のようにプロパティを定義することになる。構文も同様である。

 <property>
    <name>yarn.scheduler.capacity.root.alpha.acl_administer_queue</name>
    <value>sap_user</value>
    <description>
      The ACL of who can administer jobs on the default queue.
    </description>
  </property>

 <property>
    <name>yarn.scheduler.capacity.root.beta.acl_administer_queue</name>
    <value>bi_user,etl_user</value>
    <description>
      The ACL of who can administer jobs on the default queue.
    </description>
  </property>

 <property>
    <name>yarn.scheduler.capacity.root.default.acl_administer_queue</name>
    <value>adhoc_user</value>
    <description>
      The ACL of who can administer jobs on the default queue.
    </description>
  </property>

他の関連するキューパラメータとして "稼働中並びにペンディング状態のアプリケーショ

3) キューに設定を反映:

一度、capacity-scheduler.xmlファイルで必要なパラメータを定義したら、下記コマンドを実行してキューに設定を反映する。
yarn rmadmin -refreshQueues

上記のコマンドが無事完了した後、以下の2つの方法用いて、想定通りキューが設定されたか確認可能である:

1) hadoop queue -list

[root@phd11-nn ~]# hadoop queue -list
DEPRECATED: Use of this script to execute mapred command is deprecated.
Instead use the mapred command for it.

14/01/16 22:10:25 INFO service.AbstractService: Service:org.apache.hadoop.yarn.client.YarnClientImpl is inited.
14/01/16 22:10:25 INFO service.AbstractService: Service:org.apache.hadoop.yarn.client.YarnClientImpl is started.
======================
Queue Name : alpha
Queue State : running
Scheduling Info : Capacity: 50.0, MaximumCapacity: 1.0, CurrentCapacity: 0.0
======================
Queue Name : beta
Queue State : running
Scheduling Info : Capacity: 30.0, MaximumCapacity: 1.0, CurrentCapacity: 0.0
======================
Queue Name : default
Queue State : running
Scheduling Info : Capacity: 20.0, MaximumCapacity: 1.0, CurrentCapacity: 0.0

2) YARN resourcemanager GUI を開き、スケジューラタブをクリックする。GUI でのresourcemanager へのリンクは、http://<Resouremanager-hostname>:8088 である。ただし、8080 はデフォルトのポート番号で、<Resouremanager-hostname> は使用しているPHDクラスタに合わせたホスト名に置き換える。 以下の例は、"alpha" というキューを作成した場合のものである。

特定のキューへのジョブ投入によるジョブ実行準備:

何らかのジョブを実行する前に、ジョブを投入するキューの名前を認識するための下記のコマンドを実行する。

[fail_user@phd11-nn ~]$ id
uid=507(fail_user) gid=507(failgroup) groups=507(failgroup)

[fail_user@phd11-nn ~]$ hadoop queue -showacls
Queue acls for user :  fail_user

Queue  Operations
=====================
root  ADMINISTER_QUEUE
alpha  ADMINISTER_QUEUE
beta  ADMINISTER_QUEUE,SUBMIT_APPLICATIONS
default  ADMINISTER_QUEUE

上記の出力例では、fail_userユーザーはbetaキューでのみアプリケーションを投入することがきることが分かる。なぜなら、当該ユーザは"failgroup"グループに属し、先の例で記述されたようにcapacity-scheduler.xmlにて当該グループにはbetaキューのみ割り当てられているためである。

この記事において最初のジョブを実行する時が近づいてきた。アプリケーションを投入するため、-Dmapred.job.queue.name=<queue-name> もしくは -Dmapred.job.queuename=<queue-name> といったパラメータを使用する必要がある。

以下の例では、特定キューでのジョブ実行方法を示している。

[fail_user@phd11-nn ~]$ yarn jar /usr/lib/gphd/hadoop-mapreduce/hadoop-mapreduce-examples-2.0.5-alpha-gphd-2.1.1.0.jar wordcount -D mapreduce.job.queuename=beta /tmp/test_input /user/fail_user/test_output
14/01/17 23:15:31 INFO service.AbstractService: Service:org.apache.hadoop.yarn.client.YarnClientImpl is inited.
14/01/17 23:15:31 INFO service.AbstractService: Service:org.apache.hadoop.yarn.client.YarnClientImpl is started.
14/01/17 23:15:31 INFO input.FileInputFormat: Total input paths to process : 1
14/01/17 23:15:31 INFO mapreduce.JobSubmitter: number of splits:1
In DefaultPathResolver.java. Path = hdfs://phda2/user/fail_user/test_output
14/01/17 23:15:32 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1390019915506_0001
14/01/17 23:15:33 INFO client.YarnClientImpl: Submitted application application_1390019915506_0001 to ResourceManager at phd11-nn.saturn.local/10.110.127.195:8032
14/01/17 23:15:33 INFO mapreduce.Job: The url to track the job: http://phd11-nn.saturn.local:8088/proxy/application_1390019915506_0001/
14/01/17 23:15:33 INFO mapreduce.Job: Running job: job_1390019915506_0001
2014-01-17T23:15:40.702-0800: 11.670: [GC2014-01-17T23:15:40.702-0800: 11.670: [ParNew: 272640K->18064K(306688K), 0.0653230 secs] 272640K->18064K(989952K), 0.0654490 secs] [Times: user=0.06 sys=0.04, real=0.06 secs]
14/01/17 23:15:41 INFO mapreduce.Job: Job job_1390019915506_0001 running in uber mode : false
14/01/17 23:15:41 INFO mapreduce.Job:  map 0% reduce 0%
14/01/17 23:15:51 INFO mapreduce.Job:  map 100% reduce 0%
14/01/17 23:15:58 INFO mapreduce.Job:  map 100% reduce 100%
14/01/17 23:15:58 INFO mapreduce.Job: Job job_1390019915506_0001 completed successfully

ジョブを実行している間、どのキューにジョブが投入されたのかresource managerのGUI画面からも監視できる。以下のスナップショットは、キューの名前が表示されたもので、緑色の箇所は、上述の word count アプリケーションによって使用されたキューであることを示している。



それでは、fail_userがアプリケーションの投入を許可されていない他のキューを使用した場合に何が起こるか見てみよう。この場合、必ず失敗する。

 [fail_user@phd11-nn ~]$ yarn jar /usr/lib/gphd/hadoop-mapreduce/hadoop-mapreduce-examples-2.0.5-alpha-gphd-2.1.1.0.jar wordcount -D mapreduce.job.queuename=alpha /tmp/test_input /user/fail_user/test_output_alpha
14/01/17 23:20:07 INFO service.AbstractService: Service:org.apache.hadoop.yarn.client.YarnClientImpl is inited.
14/01/17 23:20:07 INFO service.AbstractService: Service:org.apache.hadoop.yarn.client.YarnClientImpl is started.
14/01/17 23:20:07 INFO input.FileInputFormat: Total input paths to process : 1
14/01/17 23:20:07 INFO mapreduce.JobSubmitter: number of splits:1
In DefaultPathResolver.java. Path = hdfs://phda2/user/fail_user/test_output_alpha
14/01/17 23:20:08 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1390019915506_0002
14/01/17 23:20:08 INFO client.YarnClientImpl: Submitted application application_1390019915506_0002 to ResourceManager at phd11-nn.saturn.local/10.110.127.195:8032
14/01/17 23:20:08 INFO mapreduce.JobSubmitter: Cleaning up the staging area /user/fail_user/.staging/job_1390019915506_0002
14/01/17 23:20:08 ERROR security.UserGroupInformation: PriviledgedActionException as:fail_user (auth:SIMPLE) cause:java.io.IOException: Failed to run job : org.apache.hadoop.security.AccessControlException: User fail_user cannot submit applications to queue root.alpha
java.io.IOException: Failed to run job : org.apache.hadoop.security.AccessControlException: User fail_user cannot submit applications to queue root.alpha
     at org.apache.hadoop.mapred.YARNRunner.submitJob(YARNRunner.java:307)
     at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:395)
     at org.apache.hadoop.mapreduce.Job$11.run(Job.java:1218)
     at org.apache.hadoop.mapreduce.Job$11.run(Job.java:1215)
     at java.security.AccessController.doPrivileged(Native Method)
     at javax.security.auth.Subject.doAs(Subject.java:415)
     at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1478)
     at org.apache.hadoop.mapreduce.Job.submit(Job.java:1215)
     at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1236)
     at org.apache.hadoop.examples.WordCount.main(WordCount.java:84)
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
     at java.lang.reflect.Method.invoke(Method.java:606)
     at org.apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:72)
     at org.apache.hadoop.util.ProgramDriver.driver(ProgramDriver.java:144)
     at org.apache.hadoop.examples.ExampleDriver.main(ExampleDriver.java:68)
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
     at java.lang.reflect.Method.invoke(Method.java:606)
     at org.apache.hadoop.util.RunJar.main(RunJar.java:212)

追加情報

設定可能な全パラメータ一覧に関しては、Apache Yarn Capacity Scheduler のドキュメントを参照すること。

コメント

Powered by Zendesk