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