当我尝试在一个很小的(3KB)随机生成的示例数据集上执行一个非常简单的GROUP BY时,我从Pig得到一个OutOfMemory异常。
猪脚本:
$ cat example.pig
raw =
LOAD 'example-data'
USING PigStorage()
AS (thing1_id:int,
thing2_id:int,
name:chararray,
timestamp:long);
grouped =
GROUP raw BY thing1_id;
DUMP grouped;
数据:
$ cat example-data
281906 13636091 hide 1334350350
174952 20148444 save 1334427826
1082780 16033108 hide 1334500374
2932953 14682185 save 1334501648
1908385 28928536 hide 1334367665
[snip]
$ wc example-data
100 400 3239 example-data
我们走了:
$ pig -x local example.pig
[snip]
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)
[snip]
还有一些额外信息:
$ apt-cache show hadoop | grep Version
Version: 1.0.2
$ pig --version
Apache Pig version 0.9.2 (r1232772)
compiled Jan 17 2012, 23:49:20
$ echo $PIG_HEAPSIZE
4096
此时,我觉得我必须做一些严重错误的事情,因为我看不出为什么3 kB的文本会导致堆填满的任何理由。
答案 0 :(得分:0)
选中此项:[link] http://sumedha.blogspot.in/2012/01/solving-apache-pig-javalangoutofmemorye.html
尼尔,你是对的,让我解释一下这样的事情:在bin / pig脚本文件中,源代码是:JAVA_HEAP_MAX = -Xmx1000m
#check envvars可能会覆盖默认args
if [“$ PIG_HEAPSIZE”!=“”];然后 JAVA_HEAP_MAX = “ - XMX” “$ PIG_HEAPSIZE”, “M” fi
它只是使用-Xmx开关将Java_heap_size设置为maxium(“x”),但我不知道为什么这个脚本覆盖不起作用,这就是原因,我要求你直接指定java堆大小链接中指定的参数。我没有时间检查为什么会出现这个问题。如果有任何想法请在这里发布。
答案 1 :(得分:0)
你的猪作业在MapTask.java:
中围绕以下代码失败了931 final float recper = job.getFloat("io.sort.record.percent",(float)0.05);
932 final int sortmb = job.getInt("io.sort.mb", 100);
...
945 // buffers and accounting
946 int maxMemUsage = sortmb << 20;
947 int recordCapacity = (int)(maxMemUsage * recper);
948 recordCapacity -= recordCapacity % RECSIZE;
949 kvbuffer = new byte[maxMemUsage - recordCapacity];
所以我建议您检查io.sort.mb
和io.sort.record.percent
的配置值是什么,以及是否遵循上述逻辑,maxMemUsage - recordCapacity
这比您配置的JVM接近或更大堆大小(4096 MB)
答案 2 :(得分:0)
我玩了一会儿,最后从hadoop / pig的debian软件包切换到原始的tarball,问题就消失了。不知道该怎么做:)