MapReduceアプリケーションを作成する場合には以下のような点に注意してください。
Mapタスクから出力するKeyの選択
Mapタスクが出力するKeyにもとづいて各Reduceタスクに割り当てるデータ量が決定されます。そのため、分布に偏りがあるKeyを使用すると各Reduceタスクのデータ量も偏り、最も多くデータが割り当たったReduceタスクがHadoopジョブの処理時間を左右することがあります。
Mapタスクが出力するKeyは、Reduceへのデータの割り当て量の均等化を考慮して決定してください。
Mapタスクから出力するValueの削減
Mapタスクが出力するデータ量は、作業ファイルのI/OコストやReduceタスクの全フェーズの処理コストに影響を与えます。
Reduceタスクの処理に必要のないデータは可能な限りMapタスクで取り除き、出力しないようにしてください。
プログラムの軽量化
MapReduceアプリケーションのmapメソッドやreduceメソッドはデータ1件につき1回呼び出されます。これらのメソッド内の処理はすべて、データ件数と同じ回数、数万回、数億回と実行されることになります。そのため、通常のJavaアプリケーションで特に問題なく使用している汎用的なJavaクラスやメソッドが性能に多大な影響を与えることがあります。
mapメソッドやreduceメソッドは可能な限り軽量に実装するようにしてください。
Hadoopジョブの実行に予想外の処理時間を要している場合、1つのタスク試行にかかった時間と処理件数から1件あたりの平均処理時間を求めて、その妥当性を評価してください。通常、その処理時間のほとんどはmapメソッドやreduceメソッドの実行時間が占めています。