6

使用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

每次我在本地模式下执行的猪脚本中使用 GROUP 或 JOIN 时,都会发生java.lang.OutOfMemoryError : Java heap space错误。在 HDFS 上以 mapreduce 模式执行脚本时没有错误。

问题 1:为什么在数据样本很小并且本地模式应该比 HDFS 模式使用更少的资源时出现 OutOfMemory 错误?

问题 2:有没有办法在本地模式下使用 GROUP 或 JOIN 成功运行小猪脚本?

4

2 回答 2

20

解决方法:强制 pig 为我这里设置为 10 MB 的 java 属性 io.sort.mb 分配更少的内存,错误就消失了。不确定什么是最好的价值,但至少,这允许在本地模式下练习 pig 语法

$ 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;
于 2013-05-18T18:15:32.097 回答
0

原因是您在本地分配给 Java 的内存比在 Hadoop 集群机器上分配的内存少。这实际上是 Hadoop 中非常常见的错误。它主要发生在您在 Pig 中的任何时候创建一个非常长的关系时,并且发生是因为 Pig 总是希望将整个关系加载到内存中并且不想以任何方式延迟加载它。

当您执行诸如GROUP BY分组所依据的元组在许多记录上非稀疏的情况时,您通常会至少暂时创建单个长关系,因为您基本上是在处理一大堆单独的关系并将它们全部塞进一个单长关系。要么改变你的代码,这样你就不会在任何时候创建一个很长的关系(即按更稀疏的东西分组),或者增加Java可用的内存。

于 2013-05-15T03:29:33.677 回答