2012-01-02 4 views
0

私はそこで死ぬことになるいくつかの豚のスクリプトを持っているので、Javaヒープが空き領域を使い果たしているというエラーでジョブのフェーズが短縮されます。今日まで私の唯一の解決策は減速機の数を増やすことでしたが、それはどこでも信頼できるものにはなっていないようです。今は、データの大規模な成長だけかもしれませんが、確信が持てません。リデューサーのヒープメモリ不足

スピルスレッシュホールド設定の変更について考えましたが、設定を思い出すことはできませんが、スピードスレッショルド設定を呼び出すことはできません。この問題を解決するために他にどんなことをすることができますか?

時にはこれが起き始めると、bashがスピル操作であると想定しているメモリを取得できないというエラーが表示されることがあります。これはメモリが不足しているHadoopノードですか?もしそうなら、これらのボックスのヒープサイズを下げるだけで解決策になりますか?

編集1
1)豚は0.8.1
2)のみUDFはちょうどなしのバッグやマップに単一の行を見てevalをUDFです。
3)私は、キーの乱れの原因となるホットスポットがないことに気付きませんでした。私は素数スケールを使ってこの問題を減らしてきました。私は得続けるbashのエラーここ
2012-01-04 09:58:11,179 FATAL org.apache.hadoop.mapred.TaskRunner: attempt_201112070707_75699_r_000054_1 : Map output copy failure : java.lang.OutOfMemoryError: Java heap space at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.shuffleInMemory(ReduceTask.java:1508) at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.getMapOutput(ReduceTask.java:1408) at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.copyOutput(ReduceTask.java:1261) at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.run(ReduceTask.java:1195)

されています:
java.io.IOException: Task: attempt_201112070707_75699_r_000054_0 - The reduce copier failed at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:380) at org.apache.hadoop.mapred.Child.main(Child.java:170) Caused by: java.io.IOException: Cannot run program "bash": java.io.IOException: error=12, Cannot allocate memory at java.lang.ProcessBuilder.start(ProcessBuilder.java:460) at org.apache.hadoop.util.Shell.runCommand(Shell.java:149) at org.apache.hadoop.util.Shell.run(Shell.java:134) at org.apache.hadoop.fs.DF.getAvailable(DF.java:73) at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:329) at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:124) at org.apache.hadoop.mapred.MapOutputFile.getInputFileForWrite(MapOutputFile.java:160) at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$InMemFSMergeThread.doInMemMerge(ReduceTask.java:2537) at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$InMemFSMergeThread.run(ReduceTask.java:2501)

+2

さらなる調査の結果、この問題のいくつかのバリエーションがHadoop 0.20.2で解決されたと言っているいくつかのバグレポートを手助けしていると思われる部分的な作業があることがわかりました。 回避策は、次の行を豚スクリプトに追加するか、それをpig.propertiesファイルに追加することです。デフォルトは0.70または70%です。 "set mapred.job.shuffle.input.buffer.percent 0.50;" – NerdyNick

答えて

3

は明らかにあなたがどこかのメモリが不足している

編集ここ2
は、問題のエラーです。減速機の数を増やすことは、実際にはかなり合理的です。 JobTracker Web GUIの統計情報を見て、マッパーからいくつのバイトが出ているかを確認してください。これを削減タスクの数で割ると、それは各減速材が得ているもののかなり大まかな見積もりです。残念ながら、キーが均等に分散されている場合、これは長期的にしか機能しません。

JOIN(特に複製された種類)は、この種の問題を引き起こします。これは、特定のキーの「ホットスポット」がある場合に発生します。たとえば、何らかの結合をしているとし、そのうちの1つが50%の時間を表示しているとします。どの減量兵がその鍵を扱うために幸運になるのかは分かりません。どのキーがホットスポットを引き起こしているのかを調査し、それに応じて処理することができます。私のデータでは、通常、これらのホットスポットは無意味です。何が暑いのかを知るには、GROUP BYCOUNTを実行し、何が表示されているのかを把握してください。それで有用でないならば、ちょうどFILTERそれを出してください。

この問題のもう一つの原因は、あまりにも多くのデータを集約しているJava UDFです。たとえば、データバッグを通過してレコードを何らかの種類のリストデータ構造に収集するUDFがある場合、ホットスポット値でメモリを吹き飛ばしている可能性があります。

新しいバージョンのPig(.8と.9)は、メモリの問題がはるかに少ないことがわかりました。 .7でヒープがなくなってしまった例がかなりありました。これらのバージョンはディスク検出への流出をよくしているので、ヒープを吹き飛ばすほどディスクに流出するほどスマートです。私はより有用であるためには


、あなたは豚のスクリプトを投稿しても、使用している豚のバージョン言及があります。

+0

元の質問に尋ねた内容を – NerdyNick

1

私は経験豊富なユーザーではありませんが、VMで豚のジョブを実行するときに同様の問題が発生しました。

私の特に問題は、VMにスワップスペースが設定されておらず、最終的にメモリ不足になることでした。私はあなたが適切なfreshmeat_linux/Linux]の設定でこれをしようとしていると思うが、それを行う傷つけないでしょう:free -mあなたが結果に得られるものを参照してください、おそらく問題は、

ちょっとしたことがあれば教えてください。あなたの問題に幸運!

+1

に追加しました。実際にはスワップがオフになっています。つまり、スワップを使用することは許可されていません。しかし、Hadoopの創設者の一人が話を聞いた後。この問題を解決するのに役立つ新しいバージョンのHadoop(0.23,1.0)が追加されました。袋がこぼれると、同じ大きさの子供が生まれるようです。これを処理するには、使用可能なリソースの半分になるように作品の数を設定する必要があります。新しい設定では、親プロセスと子プロセスのすべてのメモリを制御できるようになりました。 – NerdyNick