17

wordcount のような mapreduceプログラムを実行しているときに、奇妙なエラーが発生します。それぞれ 4 GB の RAM を持つ 20 個のスレーブを持つ Hadoop クラスターがあります。300MB のヒープを持つようにマップ タスクを構成し、削減タスク スロットは 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共通リンク

terasort ベンチマークを実行できる場合、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 番目の解決策の投稿に注目してください!) この集中的なシミュレーションを再開する前に、私が直面している問題について誰かの意見を聞くことができれば幸いです。今一週間。また、このコピー フェーズで何が起こっているかを完全には理解していないようです。ディスク上のマージ ソートはヒープ サイズをあまり必要としないと思いますか?

有益なコメントと回答をお寄せいただきありがとうございます。

4

4 に答える 4

17

手がかりは、削減タスクのヒープサイズが削減フェーズでほぼ完全に必要だったことだと思います。しかし、シャッフル フェーズは同じ heapspace を求めて競合しています。発生した競合により、ジョブがクラッシュしました。を下げてもジョブがクラッシュしなくなった理由はこれで説明できると思いますshuffle.input.buffer.percent

于 2013-11-26T15:32:01.847 に答える
9

あなたが引用したパラメータmapred.job.shuffle.input.buffer.percentは明らかにHadoop 2以前のパラメータです。1.04 docsごとに mapred-default.xml でそのパラメーターを見つけることができましたが、その名前は2.2.0 docsmapreduce.reduce.shuffle.input.buffer.percentごとに変更されました。

ドキュメントによると、このパラメーターの説明は次のとおりです。

シャッフル中に最大ヒープ サイズからマップ出力の格納に割り当てられるメモリの割合。

Sort と Shuffle の完全な理解については、The Hadoop Definitive Guide の第 6.4 章を参照してください。その本は、パラメータの別の定義を提供していますmapred.job.shuffle.input.buffer.percent:

シャッフルのコピー フェーズ中にマップ出力バッファーに割り当てられる合計ヒープ サイズの割合。

mapred.job.shuffle.input.buffer.percentの値をデフォルトの から に0.7減らすと0.2問題が解決することがわかったので、レデューサーのヒープ サイズの値を増やすことで問題を解決できたと言っても過言ではありません。

于 2014-11-05T06:13:03.763 に答える
3

を 0.2に変更した後でもshuffle.input.buffer.percent機能せず、同じエラーが発生しました。

/単一ノード クラスタでヒット アンド トライアルを行った後、スピルが発生した場合にプロセスがそのスペースを使用するため、ディレクトリに十分なスペースが必要であることがわかりました。

スピル ディレクトリも変更する必要があります。

于 2015-04-13T12:17:21.457 に答える