MapとReduceの数について

これは HowManyMapsAndReduces の日本語訳です。

ジョブの map と reduce への分割

ジョブのためのタスクの数を適切に選択することで、Hadoop のパフォーマンスを根本的に変えることができます。タスクの数を増やすとフレームワークのオーバーヘッドを増加させますが、ロードバランシングを増加させ、失敗した場合のコストを下げます。極端なケースで、1つの map と 1つの reduce の場合分散は行われません。反対に、100万の map と 100万の reduce の場合、オーバーヘッドのためにリソースを使い果たしてしまいます。

Map の数

map の数は通常 入力ファイルのDFS ブロックの数によって決まります。そのため DFSブロックサイズを調整してmap の数を調整することになります。処理の軽い map タスクについては最高 300くらいの数を行いましたが、mapの並列処理の適切なレベルは 1ノードあたり 10-100 マップあたりと思われます。タスクのセットアップはしばらく時間がかかるので、もっとも良いのはmap が実行するのに少なくとも1分かかる場合です。

実際、map の数の制御は微妙です。mapred.map.tasks パラメータは map の数を決めるための InputFormat へのただのヒントです。デフォルトの InputFormat の動作はバイト数の合計を適切なフラグメントの数に分割します。しかしながら、通常の場合入力ファイルの DFS ブロックサイズは入力の分割の上限値として扱われます。分割数の下限値は mapred.min.split.size で指定することが出来ます。そのため、10TB の入力データを予期し128MB の DFS ブロックがある場合、mapred.map.tasks をさらに大きい値にしない限り最終的に 82000 の map になります。最終的に、InputFormat が map の数を決定します。

map タスクの数はJobConf の conf.setNumMapTasks(int num) を使って手動で増やすことも出来ます。これは map タスクの数を増やすのに使われますが、Hadoop が 入力データの分割によって決定した map の数より少ない数には設定しません。

Reduce の数

reduce の適切な数は 0.95 もしくは 1.75 * (ノードの数 * mapred.tasktracker.tasks.maximum) だと思われます。0.95 のとき、すべての reduce はすぐに起動し、map が終了した時に map の出力を転送を開始します。1.75 のとき、早いノードは reduce の最初の回を終え、ロードバランスのよりよいジョブを行う2回目の reduce を起動します。

現在 reduce の数は、出力ファイルのバッファサイズ(io.buffer.size * 2 * numReduces << heapSize) によって大体 1000 に制限されています。これはいずれ修正されるでしょうが、それまではかなり安定した上限値となります。

reduceの数は、出力ディレクトリに出力されるファイルの数もコントロールします。しかし、その次の map/reduce ステップがmap のためにそれらをさらに小さく分割してしまうので、普通これは重要ではありません。

また、reduce タスクの数は map タスクと同じ方法、JobConf の conf.setNumReduceTasks(int num) で、増やすことが出来ます。

last edited 2008-08-06 12:32:31 by AmarKamat

お問い合わせ・ご相談はこちら

OpenCMSサポート

充実のユビキャストユーザー向けプラン

サポート詳細はこちら

Ubicast スタッフブログ

  • OpenCMS 公式サイト
  • メールでブログ投稿
  • プロジェクト管理ツール