Hadoopのパフォーマンスチューニングを行っているときに、非常に奇妙なケースが発生しています。大きな中間出力(InvertedIndexやコンバイナーなしのWordCountなど)でジョブを実行していましたが、ネットワークと計算リソースはすべて同種です。mapreduceの仕組みによると、WAVESが多い場合タスクを減らす場合、マップとシャッフルのオーバーラップが少なくなるため、全体の実行時間は遅くなりますが、そうではありません。5 WAVEのreduceタスクを使用したジョブは、1 WAVEのタスクを使用したジョブよりも約10%高速であることがわかります。また、ログを確認したところ、reduceタスクが少ないほどマップタスクの実行時間が長くなり、また、reduceフェーズ中の全体的な計算時間(シャッフルやマージではない)がタスクが少ないほど長くなることがわかりました。マップとシャッフルが重複しないようにreduceslow-startfactorを1に設定して他の要素を除外しようとしました。また、同時に実行されるreduceタスクを1つだけに制限して、重複がないようにしました。リデュースタスクの合間に、スケジューラーを変更して、マッパーとレデューサーを別のマシンに配置するように強制し、I/Oの輻輳が発生しないようにしました。上記のアプローチでも、同じことが起こります。(また、マップメモリバッファーを十分に大きく設定し、io.sort.factorを32以上に設定し、それに応じてio.sort.mbを320より大きく設定しました)
この問題を引き起こす他の理由は本当に考えられないので、何か提案をいただければ幸いです。
混乱した場合に備えて、私が経験している問題は次のとおりです。
0.他のすべての同じ構成で、同じジョブの1つのreduceタスクと5つのreduceタスクを実行した場合のパフォーマンスを比較しています。計算を減らすためのタスクトラッカーは1つだけです。
1.どちらの場合もredcueタスク用のtasktrackerを1つだけ持つことで、すべてのreduceタスクを順番に実行するように強制しました。また、mapred.tasktracker.reduce.tasks.maximum = 1なので、reduceフェーズ中に並列処理は発生しません。
2. mapred.reduce.slowstart.completed.maps = 1を設定したので、すべてのマップが完了する前に、どのレデューサーもデータのプルを開始しません。
3. 1つのreduceタスクを持つことは、5つのSEQUENTIALreduceタスクを持つことよりも遅いことがわかります。
4. set mapred.reduce.slowstart.completed.maps = 0.05を設定して、マップとシャッフルのオーバーラップを許可した場合でも(したがって、reduceタスクが1つしかない場合は、オーバーラップが大きくなり、実行速度が速くなります。削減タスクは順次実行されます)5-削減タスクは1-削減タスクよりも高速であり、1-削減タスクのマップフェーズは遅くなります!