Tech Blog 〜ぞうの日記

HadoopやLinux関連の技術的な内容の紹介です

(3日目)MapReduce v1のスケジューリングアルゴリズム

元記事

 

3日目です。 本日のHadoopアドベントカレンダー2013は@shiumachi氏の「HBase 0.96 で導入される新しいコンパクション「Exploring Compaction」」です。コンパクションも進化しているということがわかりますね。 さて、MapReduceでJobTrackerにジョブを投入すると、スケジューリングアルゴリズムに従って分散実行が行われます。スケジューリングアルゴリズムは、管理者がアルゴリズムを指定することができます。MapReduce version 1では下記の3つのスケジューリングアルゴリズムが用意されています。

MapReduce version1のスケジューリングアルゴリズム

  1. デフォルト(FIFO
  2. フェアスケジューラ
  3. キャパシティスケジューラ

上記をmapred-site.xmlに設定することができ、用途に応じて選択します。デフォルトのアルゴリズムは大規模環境に適さない場合が多いので、変更を検討して下さい。大まかな特徴と、それぞれのスクリーンショットを紹介します。

デフォルトのスケジューラ

デフォルトのスケジューラはシンプルで、1人で利用する場合、開発中、簡単なテストなどに向いています。一方、タスクの選択はFIFOアルゴリズムで行われるため、テスト用のジョブと本番用のジョブを同時に実行するような場合、本番のジョブの実行までに長時間待たされる可能性があります。

fifoscheduler_top図1-1 JobTrackerのwebUI (FIFO Scheduler)

fifoscheduler_queue図1-2 JobTrackerのwebUI: Default Queue (FIFO Scheduler)

フェアスケジューラ

フェアスケジューラは、基本的に「公平性」があります。複数のユーザーが並行してジョブを投入すると、ジョブはクラスタのリソースを公平に利用します。フェアスケジューラはタスクのプリエンプションの設定ができるため、本番用のジョブが開始されるまで、長時間待たされないようにすることができます。

fairscheduler_top図2-1 JobTrackerのwebUI (FairScheduler)

fairscheduler_schedule図2-2 JobTrackerのScheduler UI (FairScheduler)

fairscheduler_preemption_job図2-3 プリエンプションされた場合(Killedの数字が増えている)

キャパシティスケジューラ

キャパシティスケジューラは、管理者が設定したキューにジョブを投入することができます。フェアスケジューラとは異なり、プリエンプションはできません。しかし、キャパシティスケジューラはメモリの使用量に基づいて割り当てを制御できるという特徴があります。

capacityscheduler_top2図3-1 JobTrackerのwebUI (Capacity Scheduler)

capacityscheduler_scheduler図3-2 JobTrackerのScheduler UI (Capacity Scheduler)

capacityscheduler_queue図3-2 JobTrackerのScheduler UI (Queue)

MapReduce v2

MapReduce v2については別途書くつもりですが、フェアスケジューラはは大きく変わっています。(参考リンク)大きなところでは「プールではなくキューになった」とか、「キューはネストできる」というあたりかと。 スクリーンショットはこちら。

YARN_fair図4-1 FairScheduler on YARN

スケジューラのまとめ

上記で見てきたように、管理者はスケジューリングアルゴリズムを選択することができます。 それぞれのスケジューラの細かい特徴、各種設定については、オライリーの「Hadoopオペレーション」が詳しいので、管理者の方にとってはかなり参考になるでしょう。 不特定多数の人が利用するクラスタの場合、フェアスケジューラの公平性とプリエンプションはメリットがあります。逆に、デフォルトのスケジューラのままで運用している場合、アルゴリズムを見直すと効果的かもしれませんね。