wordcount-likemapreduceプログラムの実行中に奇妙なエラーが発生します。 20個のスレーブを持つhadoopクラスターがあり、それぞれに4GBのRAMがあります。マップタスクを300MBのヒープを持つように構成し、reduceタスクスロットは1GBになりました。ノードごとに2つのマップスロットと1つのリデューススロットがあります。マップタスクの最初のラウンドが終了するまで、すべてがうまくいきます。その後、進捗状況は100%のままです。次に、コピーフェーズが行われていると思います。各マップタスクは次のようなものを生成します。
Map output bytes 4,164,335,564
Map output materialized bytes 608,800,675
(私は圧縮にSnappyCodecを使用しています)
ストールを約1時間行った後、次の例外を除いて、reduceタスクが発生します。
Error: Java.lang.OutOfMemoryError: Java heap space at
org.Apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.shuffleInMemory(ReduceTask.Java:1703) at
org.Apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.getMapOutput(ReduceTask.Java:1563) at
org.Apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.copyOutput(ReduceTask.Java:1401) at
org.Apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.run(ReduceTask.Java:1333
グーグルでこのリンクを見つけましたが、どうすればよいかわかりません: hadoop common link
Hadoopがテラソートベンチマークを実行できる場合、コピーとマージで問題が発生する理由がわかりません。すべてのマップ出力がレデューサースレッドのRAMに収まる必要があるということはあり得ません。では、ここで何が起こっているのでしょうか。
上記のリンクでは、次のパラメータの調整について説明しています。
mapreduce.reduce.shuffle.input.buffer.percent = 0.7
mapreduce.reduce.shuffle.memory.limit.percent = 0.25
mapreduce.reduce.shuffle.parallelcopies = 5
彼らは、パラメータの積が> 1であるという事実は、ヒープサイズエラーを許容すると主張しています。編集:5 * 1.25 * 0.7はまだ<1なので、2番目のソリューション投稿に焦点を合わせてください!)この集中的なシミュレーションを再開する前に、私が直面している問題に関する誰かの意見を聞いてとてもうれしく思います。今から一週間。また、このコピーフェーズで何が起こっているのかを完全には理解していないようです。ディスク上のマージソートでは、ヒープサイズをあまり必要としないと思いますか?
有益なコメントと回答を事前に感謝します!
手がかりは、私の削減タスクのヒープサイズが削減フェーズでほぼ完全に必要だったということだと思います。しかし、シャッフルフェーズは同じヒープスペースをめぐって競合しています、発生した競合により、ジョブがクラッシュしました。これが、shuffle.input.buffer.percent
を下げてもジョブがクラッシュしなくなった理由を説明していると思います。
引用するパラメーターmapred.job.shuffle.input.buffer.percent
は、明らかにHadoop2より前のパラメーターです。 1.04 docs ごとにmapred-default.xmlでそのパラメーターを見つけることができましたが、その名前は 2.2.0 docs ごとにmapreduce.reduce.shuffle.input.buffer.percent
に変更されました。
ドキュメントによると、このパラメータの説明は次のとおりです。
最大ヒープサイズからシャッフル中にマップ出力を格納するために割り当てられるメモリの割合。
ソートとシャッフルの完全な理解については、 Hadoop Definitive Guideの6.4章 を参照してください。その本は、パラメータmapred.job.shuffle.input.buffer.percent
の代替定義を提供します。
シャッフルのコピーフェーズ中にマップ出力バッファに割り当てられる合計ヒープサイズの割合。
mapred.job.shuffle.input.buffer.percent
の値をデフォルトの0.7
から0.2
に減らすと問題が解決することがわかったので、値を増やすことで問題を解決できたと言っても過言ではありません。レデューサーのヒープサイズの。
shuffle.input.buffer.percent
を0.2に変更した後でも、機能せず、同じエラーが発生します。
シングルノードクラスターでヒットとトライアルを行った後、プロセスが流出の場合にそのスペースを使用するため、/
ディレクトリに十分なスペースが必要であることがわかりました。
流出ディレクトリも変更する必要があります。
関連するバグ- https://issues.Apache.org/jira/browse/MAPREDUCE-6724
計算されたmaxSingleShuffleLimit> MAX_INTの場合、NegativeArraySizeExceptionが発生する可能性があります