2013-05-11 51 views
6

使用Apache的豬版本0.10.1.21(報告), CentOS版本6.3(最終),jdk1.6.0_31(該Hortonworks沙箱V1.2 VirtualBox上,擁有3.5 GB RAM)豬本地模式下,基,或加入= java.lang.OutOfMemoryError:Java堆空間

$ cat data.txt 
11,11,22 
33,34,35 
47,0,21 
33,6,51 
56,6,11 
11,25,67 

$ cat GrpTest.pig 
A = LOAD 'data.txt' USING PigStorage(',') AS (f1:int,f2:int,f3:int); 
B = GROUP A BY f1; 
DESCRIBE B; 
DUMP B; 

pig -x local GrpTest.pig

[Thread-12] WARN org.apache.hadoop.mapred.JobClient - No job jar file set. User classes may not be found. See JobConf(Class) or JobConf#setJar(String). 
[Thread-12] INFO org.apache.hadoop.mapreduce.lib.input.FileInputFormat - Total input paths to process : 1 
[Thread-13] INFO org.apache.hadoop.mapred.Task - Using ResourceCalculatorPlugin : [email protected] 
[Thread-13] INFO org.apache.hadoop.mapred.MapTask - io.sort.mb = 100 
[Thread-13] WARN org.apache.hadoop.mapred.LocalJobRunner - job_local_0002 
java.lang.OutOfMemoryError: Java heap space 
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:949) 
    at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:674) 
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:756) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370) 
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:212) 
[main] ERROR org.apache.pig.tools.pigstats.PigStatsUtil - 1 map reduce job(s) failed! 
[main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1066: Unable to open iterator for alias B 

java.lang.OutOfMemoryError:Java堆空間每次使用GRO時間發生錯誤UP或JOIN在本地模式下執行的豬腳本中。在HDFS上以mapreduce模式執行腳本時沒有錯誤。

問題1:當數據樣本很小而本地模式比HDFS模式佔用更少的資源時,怎麼會出現OutOfMemory錯誤?

問題2:是否有解決方案可以在本地模式下成功運行GROUP或JOIN的小豬腳本?

+0

我從來沒有做任何團體或煩惱在本地地圖加入減輕模式下,即使在非常大的數據集。 ..我想象或者您的JVM的設置都搞砸了,或者你的本地豬/ Hadoop的設置某種內存最大允許設置爲0,你肯定它只是羣組以及加入該本地失敗?如果你使用大量的內存用於非豬相關的Java程序,會發生什麼情況? – DMulligan 2013-05-11 18:29:36

+0

嗨,這是Hortonwords沙盒。當我通過GUI連接時(Hortons HUE GUI允許通過同一個沙箱的HDFS上的Web瀏覽器運行Pig,Hive)。所有演示運行良好,具有更大的數據集(10 MB)。所以我想JVM可以處理更大的負載。這顯然是本地模式下的一個錯誤。只要有GROUP或JOIN,Pig就會因java OutOfMemory錯誤而失敗。無論數據樣本大小如何,Grunt shell還是Pig Script。 – Polymerase 2013-05-11 20:25:04

+0

我對Hortonwords一無所知,但是如果你在本地使用DISTINCT進行查詢,那麼工作正常嗎?有允許洗牌,排序,加入了一堆的最大內存的Hadoop /豬相關的設置等。我的猜測是那些仍然那1 0 – DMulligan 2013-05-12 00:45:13

回答

19

解決方案:力豬爲Java屬性io.sort.mb 我設置爲10 MB這裏分配較少的內存和錯誤消失。不知道什麼是最好的價值,但至少,這讓練習豬語法在本地模式

$ cat GrpTest.pig 
--avoid java.lang.OutOfMemoryError: Java heap space (execmode: -x local) 
set io.sort.mb 10; 

A = LOAD 'data.txt' USING PigStorage(',') AS (f1:int,f2:int,f3:int); 
B = GROUP A BY f1; 
DESCRIBE B; 
DUMP B; 
0

的原因是你必須分配給Java的內存更少本地高於您在Hadoop集羣機器做。這實際上是Hadoop中一個非常常見的錯誤。當您創建在任何點豬很長的關係,它主要發生,並且發生,因爲豬總是要到整個關係加載到內存中,並且不希望延遲加載它以任何方式。

當你做類似GROUP BY的事情時,你正在分組的元組在很多記錄中是非稀疏的,所以你經常結束創建單個長關係,至少是暫時的,因爲你基本上正在接受一大堆個人關係,把他們全部融合成一個長長的關係。要麼改變你的代碼,以免在任何時候創建單一的非常長的關係(例如,用更稀疏的東西來分組),要麼增加Java可用的內存。

+1

請看看我的第一篇文章。示例中使用的數據的整個大小不超過100個字節。換句話說,少於這條評論的長度。無論豬潛在管道的智能性如何,當絕對沒有記憶問題時,OutOfMemory無法藉故失敗。這顯然是一個錯誤。 – Polymerase 2013-05-18 18:12:20

相關問題