halookで始めるHadoop/HBaseトラブルシューティング

第6回 Capacity Scheduler による複数ジョブの同時実行

この記事を読むのに必要な時間:およそ 3 分

前回の記事では,Fair Schedulerによる複数ジョブの同時実行についてご紹介しました。今回は,Capacity Schedulerを使った場合について,複数ジョブの同時実行時の挙動を見てみましょう。

HadoopのSchedulerとは複数のジョブを実行する際に,slot数の割り当てを制御し,均等にリソースを割り振ってすべてのジョブが同時に動くようにしたり,優先度の高いジョブから実行させたりといったことを可能にするものです。Scheduler自体の意義については,具体例とともに前回の記事に記載しているので併せて参考にしてください。

Capacity Schedulerとは?

Fair Schedulerは,あらかじめ「pool」を定義して,poolごとにslot数の割り当てなどを決め,ジョブの実行時にどのpoolに属するジョブかを指定しました。Capacity Schedulerでは,⁠queue」を定義して,それぞれのqueueに対してslot数の割り当てなどを決めます。

Fair Schedulerの場合,同じpoolに属するジョブ同士は,公平にリソースを分け合うのが基本(設定で,FIFOの順に実行させることもできます)でしたが,Capacity Schedulerの場合は,同じqueueに属するジョブは基本的にはFIFOの順に実行されます。このqueueの中で,ジョブの優先度によって順番を入れ替えたり,実行するユーザごとにslot数の割り振りを変えたり,メモリ使用量に応じてタスクの同時実行数を制限したりできることが,Capacity Schedulerの特徴となっています。

Capacity Schedulerの利用

Capacity Schedulerを使うためには以下の作業が必要です。

  1. Capacity SchedulerのJARファイルをHadoop のcontrib/ capacity-schedulerディレクトリからlib ディレクトリにコピーし,Hadoopのクラスパスに配置する。

  2. mapred-site.xmlのmapred.jobtracker.taskSchedulerプロパティを以下の値に設定する。

    org.apache.hadoop.mapred.CapacityTaskScheduler
    
  3. queue名を定義する。

    mapred-site.xmlのmapred.queue.namesプロパティにqueue名をカンマ区切りで指定する(デフォルトは「default」という名前のqueueのみが定義されている)⁠

    例:

    <property>
      <name>mapred.queue.names</name>
      <value>default,queue1,queue2</value>
    </property>
    
  4. 各queueの設定をconf/capacity-scheduler.xmlに記載する。

  5. 設定ファイル変更後,JobTrackerとTaskTrackerを再起動する。

  6. ジョブの実行時に,mapred.job.queue.name プロパティでqueue名を指定する。

    capacity-scheduler.xmlには,

    mapred.capacity-scheduler.queue.<queue-name>.<property-name>
    

    という形で,queue名とプロパティの名前を指定して,必要な設定を行います。たとえば,queue1に割り当てるキャパシティ(%)を75%にするには次のように記載します。

    <property>
      <name>mapred.capacity-scheduler.queue.queue1.capacity</name>
      <value>75</value>
    </property>
    

    queueごとに設定可能なプロパティはいくつかありますが,まず設定すべきはこのcapacityになります。mapred.queue.namesプロパティで定義したすべてのqueueに対して,それぞれのqueueがクラスタ全体の何%のslotを使用するのかをここで定義します。ここで指定する,各queueのcapacityの合計がちょうど100%になっていないと,以下のようなエラーメッセージを表示してJobTrackerが起動に失敗するので,注意しましょう。

    2013-05-06 21:45:38,471 FATAL org.apache.hadoop.mapred.JobTracker: java.lang.IllegalArgumentException: Sum of queue capacities not 100% at 75.0
         at org.apache.hadoop.mapred.CapacityTaskScheduler.parseQueues(CapacityTaskScheduler.java:921)
    

さて,それでは,Capacity Schedulerを設定するとMapReduceジョブ実行時にどのように動作するか,halookで見てみましょう。

前回の記事と同様,クラスタ全体でMapのslot数が8の環境(CDH3u5)で,以下の2つのジョブを実行します。

  • ジョブA:Mapタスク数40,Reduceタスク数0
  • ジョブB:Mapタスク数10,Reduceタスク数0

1Mapタスクの実行にかかる時間は1分とします。ジョブAだけをこのクラスタ上で動かすと,8タスクの同時実行×5回で5分かかります。ジョブBだけを動かすと,8タスク,2タスクを順に動かし,2分かかります。図1の(1)がジョブAを単体で動かしたもの,図1の(2)がジョブBを単体で動かしたものです。

図1 ジョブA,ジョブBの個別実行と同時実行

図1 ジョブA,ジョブBの個別実行と同時実行

図2が,ジョブAを,図3がジョブBを単体実行した結果です。どちらも,8タスクずつ同時に実行されていることが,halookのArrow Chart 画面の矢印の数およびConcurrent task num のグラフで確認できます。また,(3)と(4)は,ジョブAを開始した直後にジョブBを,Schedulerの設定なしに実行した結果です。(4)は(2)と同じジョブBですが,リソースを(3)のジョブAに占有されているため,待たされていることがわかります図4)⁠

図2 (1)ジョブAの単体実行

図2 (1)ジョブAの単体実行

図3 (2)ジョブBの単体実行

図3 (2)ジョブBの単体実行

図4 (4)ジョブAの終了を待機するジョブB

図4 (4)ジョブAの終了を待機するジョブB

著者プロフィール

落合雄介(おちあいゆうすけ)

Acroquest Technology株式会社 オブジェクトフレームワークディヴィジョン エンジニアリングクリエーター

http://www.acroquest.co.jp/

コメント

コメントの記入