Tech Blog 〜ぞうの日記

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

(5日目)MRv1におけるフェアスケジューラでのプリエンプション

元記事

 

5日目です

 

3日目に書いたMapReduceのスケジューラでうち、フェアスケジューラには「プリエンプション」という設定ができます。この設定をすることで、例えば緊急度の高くない長時間実行されているタスクを強制的にKillして、すぐに実行する必要があるジョブのタスク用にスロットを空けることができます。

フェアスケジューラの設定

CDH4ではMapReduce v1とv2の両方が利用できますが、MapReduce v1でのフェアスケジューラのドキュメント(フェアスケジューラーガイド)はこちらをご覧下さい。 Fair Scheduler Guide 最低限、フェアスケジューラのプリエンプションに必要な設定は、mapred-site.xml

<property>
  <name>mapred.jobtracker.taskScheduler</name>
  <value>org.apache.hadoop.mapred.FairScheduler</value>
</property>

<property>
  <name>mapred.fairscheduler.allocation.file</name>
  <value>/etc/hadoop/conf/allocations.xml</value>
</property>

<property>
  <name>mapred.fairscheduler.preemption</name>
  <value>true</value>
</property>

のような設定を行い、フェアスケジューラ用の設定ファイル(例えばこの例では allocations.xml)でMap、Reduceの最小限の配分と、プリエンプションのタイムアウト値を設定します。(例)

<?xml version="1.0"?>
<allocations>
  <pool name="preempt">
    <minMaps>2</minMaps>
    <minReduces>2</minReduces>
    <minSharePreemptionTimeout>10</minSharePreemptionTimeout>
  </pool>
</allocations>

プリエンプションが生じると、ログファイルには以下のように記述されます。今回はpreemptプールにプリエンプションを設定しています。プリエンプションが生じて、Killがリクエストされていることがわかりますね。

2013-11-19 01:44:49,231 INFO org.apache.hadoop.mapred.FairScheduler: Should preempt 1 MAP tasks for pool preempt: tasksDueToMinShare = 1, tasksDueToFairShare = 0
2013-11-19 01:44:49,231 INFO org.apache.hadoop.mapred.TaskInProgress: Request received to kill task 'attempt_201311190125_0005_m_000000_3' by user

JobTrackerのwebUIでのタスク試行のログはこんな感じになります。(設定を極端にしているので、かなり激しくKillされていますが)fairscheduler_preemption_task今日は簡単ですがこの辺で。