生物物理計算化学者の雛

主に科学に関する諸々を書き留めています。

MapReduceジョブ優先度の変更

HadoopのデフォルトのスケジューラはFIFO(First In First Out)なので、MapReduceジョブは投入順に実行されます。
そのため長時間かかるMapReduce処理を流していると、他のMapReduce処理は長時間またされることになります。

この場合、先に実行したい処理の優先度を上げてやることで、先に処理をさせることが可能になります。
詳細はHadoop本(初版)p.178に載っています。
なお、以下の例はバージョン0.21.0の場合ですので、0.20.2では修正が必要かもしれません。

Java MapReduceプログラムの場合

以下のようにsetPriority関数によって優先度を上げることができます。
指定可能な優先度はVERY_LOW, LOW, NORMAL, HIGH, VERY_HIGHの5段階です。

Cluster cluster = new Cluster(getConf());
Job job = Job.getInstance(cluster, getConf());
job.setPriority(JobPriority.VERY_HIGH);

Hadoop streamingの場合

実行時にmapred.job.priorityを指定することで優先度を設定できます。

hadoop jar $HADOOP_HOME/mapred/contrib/streaming/hadoop-0.21.0-streaming.jar \
-input /streaming/input \
-output /streaming/output \
-mapper `pwd`/map.sh \
-jobconf mapred.job.priority=HIGH

実行中のMapReduceジョブの優先度を変更する

実行中のジョブの優先度は

mapred job -set-priority job_201106301111_0056 HIGH

により変更することが可能です。なお、ジョブIDはコマンド

mapred job -list

により、またはWebブラウザの「Hadoop Map/Reduce Administration」(デフォルトポート番号50030)によって調べることができます。
(バージョン0.20.2では実行コマンド名は"mapred"ではなく"hadoop")