使用 Apache Pig版本0.10.1.21 (已报告), CentOS版本6.3(最终版),jdk1.6.0_31(Virtualbox上的Hortonworks Sandbox v1.2,3.5 GB RAM)
$ 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 : org.apache.hadoop.util.LinuxResourceCalculatorPlugin@19a9bea3
[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
每次在本地模式下执行的pig脚本中使用GROUP或JOIN时,都会出现 java.lang.OutOfMemoryError:Java堆空间错误。在HDFS上以mapreduce模式执行脚本时没有错误。
问题1 :如果数据样本微不足道且本地模式使用的资源少于HDFS模式,那么OutOfMemory错误怎么会出现?
问题2 :是否有解决方案在本地模式下成功运行GROUP或JOIN的小型猪脚本?
答案 0 :(得分:20)
解决方案:强制pig为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;
答案 1 :(得分:0)
原因是您在本地分配的Java内存少于在Hadoop集群计算机上分配的内存。这实际上是Hadoop中一个非常常见的错误。它主要发生在你在任何时候在Pig中创建一个非常长的关系时,并且因为Pig总是希望将整个关系加载到内存中并且不想以任何方式延迟加载它。 / p>
当你执行GROUP BY
之类的事情时,你所分组的元组在许多记录中都是非稀疏的,你经常最终会暂时创建一个单独的长关系,因为你基本上是把一大堆个人关系并将它们全部塞进一个长长的关系中。要么改变你的代码,要么不要在任何时候创建单个非常长的关系(即通过更稀疏的东西组合),或者增加Java可用的内存。