Apache Pig:在本地模式下使用简单GROUP BY的OutOfMemory异常

时间:2012-04-15 20:12:01

标签: out-of-memory apache-pig

当我尝试在一个很小的(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的文本会导致堆填满的任何理由。

3 个答案:

答案 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.mbio.sort.record.percent的配置值是什么,以及是否遵循上述逻辑,maxMemUsage - recordCapacity这比您配置的JVM接近或更大堆大小(4096 MB)

答案 2 :(得分:0)

我玩了一会儿,最后从hadoop / pig的debian软件包切换到原始的tarball,问题就消失了。不知道该怎么做:)