2012-01-02 82 views
0

所以我有幾個Pig腳本在那裏繼續死亡,減少了Java堆中空間不足的錯誤。到目前爲止,我唯一的解決方案是增加減速器數量,但這似乎並沒有讓我可靠。現在,其中一部分可能只是我們正在獲得的數據的大幅增長,但不能確定。Reducer's堆內存不足

我想過改變溢出閾值設置,不能記得設置,但不知道他們是否會幫助或減慢它。我可以看看我能做些什麼來解決這個問題?

關於一個側面說明,當這種情況偶爾發生時,我也會得到有關bash無法獲得內存的錯誤,因爲我認爲這是溢出操作。這是否是Hadoop節點內存不足?如果是這樣的話,只能在這些盒子上減小堆大小的解決方案?

編輯1
1)豬0.8.1
2)唯一的UDF是一個eval UDF,僅僅着眼於與無袋或地圖單個行。
3)我沒有注意到有任何熱點壞鑰匙distrobution。我一直在使用素數標度來減少這個問題。

編輯2
這裏是有問題的錯誤:
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)

這裏是bash的錯誤我不斷收到:
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 2012-01-18 16:27:29

回答

3

顯然你是什麼地方運行內存。增加還原劑的數量實際上是相當合理的。查看JobTracker Web GUI上的統計數據,看看有多少字節正在離開映射器。除以減少任務的數量,這是對每個減速器得到的東西的相當粗略的估計。不幸的是,如果您的密鑰均勻分佈,這隻能長期運行。

在某些情況下,JOIN(尤其是複製類型)會導致此類問題。當你有一個特定鍵的「熱點」時,會發生這種情況。例如,假設您正在進行某種連接,並且其中一個鍵顯示了50%的時間。不管減速器如何幸運地處理這把鑰匙,都會遭到破壞。您可能想要調查哪些鍵導致熱點並相應地處理它們。在我的數據中,通常這些熱點無論如何都是無用的。要了解熱點內容,只需執行GROUP BYCOUNT並找出顯示的內容。那麼,如果它沒有用,只需要FILTER就可以了。

此問題的另一個來源是Java UDF聚合方式太多的數據。例如,如果您有一個通過數據包的UDF並將記錄收集到某種列表數據結構中,那麼您可能會用熱點值來吹噓你的記憶。

我發現較新版本的Pig(.8和.9尤其)具有少得多的內存問題。我有好幾個例子在.7中耗盡堆。這些版本對磁盤檢測的溢出效果要好得多,因此如果它即將炸燬堆,它足夠聰明,可以溢出到磁盤。


爲了讓我更有幫助,您可以發佈您的豬腳本,並提及您使用的豬的版本。

+0

我將您提問的詳情添加到了原始問題 – NerdyNick 2012-01-04 17:48:06

1

我不是一個有經驗的用戶或任何東西,但在虛擬機上運行豬作業時遇到類似的問題。

我特別的問題是,虛擬機沒有配置交換空間,它最終會耗盡內存。我想你正在嘗試在一個適當的Linux配置,但它不會傷害做一個:free -m,看看你得到的結果,也許這個問題是由於你配置的交換內存太少。

只是一個想法,讓我知道它是否有幫助。祝你好運!

+1

我們實際上關閉了swappiness。即不允許甚至使用交換。但是在聽到Hadoop的創始人之一的談話之後。 Hadoop的後續版本中增加了一個新配置(0.23,1.0),可幫助您解決此問題。看起來,當Bag流出時,它會產生一個大小相等的孩子。要處理這個問題,現在您需要將您的作品數量配置爲可用資源的一半。新配置允許您現在控制父進程和子進程的所有內存。 – NerdyNick 2012-03-03 17:58:35