【问题标题】:Pig local mode, group, or join = java.lang.OutOfMemoryError: Java heap spacePig 本地模式、组或加入 = java.lang.OutOfMemoryError: Java heap space
【发布时间】:2013-05-11 16:36:56
【问题描述】:

使用 Apache Pig 版本 0.10.1.21(已报告), CentOS release 6.3 (Final), jdk1.6.0_31 (The Hortonworks Sandbox v1.2 on Virtualbox, with 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 heap space 错误。脚本在HDFS上以mapreduce方式执行时没有错误。

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

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

【问题讨论】:

  • 我在本地 map reduce 模式下进行分组或加入从来没有遇到过任何麻烦,即使在非常大的数据集上也是如此……我想要么你的 JVM 设置搞砸了,要么你的本地 pig/hadoop 集某种最大内存允许设置为 0。你确定它只是 GROUP 和 JOIN 在本地失败?如果你为一个非猪相关的 java 程序使用大量内存会发生什么?
  • 嗨,这是 Hortonwords 沙盒。当我通过 GUI 连接时(允许在同一沙箱的 HDFS 上通过 Web 浏览器运行 Pig、Hive 的 Hortons HUE GUI)。所有演示在更大的数据集 (10 MB) 上运行良好。所以我想JVM可以处理更大的负载。这显然是本地模式下的错误。只要有 GROUP 或 JOIN,Pig 就会失败并出现 java OutOfMemory 错误。无论数据样本大小、Grunt shell 还是 Pig 脚本。
  • 我对 Hortonwords 一无所知,但如果您在本地使用 DISTINCT 进行查询,是否可以正常工作?有一堆与 Hadoop/pig 相关的设置,用于洗牌、排序、加入等允许的最大内存。我的猜测仍然是其中 1 是 0。
  • 对于在寻找ERROR 1066: Unable to open iterator for alias 时发现此帖子的人,这里是generic solution。

标签: apache-pig


【解决方案1】:

解决方案:强制 pig 为 java 属性 io.sort.mb 分配更少的内存 我在这里设置为 10 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;

【讨论】:

  • 我可以将set io.sort.mb 10; 保留在 MR 模式中还是应该删除它?
【解决方案2】:

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

当您执行GROUP BY 之类的操作时,您分组的元组在许多记录中是非稀疏的,您经常会最终创建单个长关系,至少是暂时的,因为您基本上是在处理一大堆个人关系并将它们全部塞进一个单一的长期关系中。要么更改代码,以免在任何时候创建单个非常长的关系(即按更稀疏的东西分组),要么增加 Java 可用的内存。

【讨论】:

  • 请看我最初的帖子。示例中使用的数据的总大小小于 100 字节。换句话说,少于此评论的长度。不管底层管道的猪有多聪明,在绝对没有内存问题的情况下,没有任何借口会因为 OutOfMemory 而失败。这显然是一个错误。
猜你喜欢
  • 2012-08-03
  • 2020-11-30
  • 2013-06-06
  • 2016-04-15
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
相关资源
最近更新 更多