当我试图在一个小的(3kb)随机生成的示例数据集上执行一个非常简单的groupby时,pig出现了一个outofmemory异常。
Pig剧本:
$ 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
在这一点上,我觉得我一定是做错了什么,因为我看不出为什么3KB的文本会导致堆被填满。
3条答案
按热度按时间llmtgqce1#
检查:[链接]http://sumedha.blogspot.in/2012/01/solving-apache-pig-javalangoutofmemorye.html
尼尔,你说得对,我来解释一下:在bin/pig脚本文件中,源代码是:
java 堆最大值=-xmx1000m
检查可能覆盖默认参数的环境变量
如果[“$pig_heapsize”!=”“];然后java\u heap\u max=“-xmx”“$pig\u heapsize”“m”fi
它只使用-xmx开关将java\u heap\u size设置为maxium(“x”),但我不知道为什么这个脚本重写不起作用,这就是原因,我要求您使用链接中指定的参数直接指定java heap size。我没来得及检查为什么会出现这个问题。如果有人有主意,请把它贴在这里。
t5zmwmid2#
我玩了一段时间,结果从用于hadoop/pig的debian包切换到原始tarball,问题就消失了。不知道该怎么解释:)
6kkfgxo03#
您的pig作业在maptask.java中的以下代码周围失败:
所以我建议你检查一下
io.sort.mb
以及io.sort.record.percent
是否遵循上述逻辑,maxMemUsage - recordCapacity
这接近或大于配置的jvm堆大小(4096MB)