在 AWS EMR 上使用 pig 的 Java 堆空间

Posted

技术标签:

【中文标题】在 AWS EMR 上使用 pig 的 Java 堆空间【英文标题】:Java heap space using pig on AWS EMR 【发布时间】:2016-03-26 08:35:44 【问题描述】:

我在 AWS EMR 集群(4 核 m3.xlarge)上处理 40GB 文本文件时遇到了这个问题。 FATAL [main] org.apache.hadoop.mapred.YarnChild:运行子错误:java.lang.OutOfMemoryError:Java 堆空间

它发生在映射过程中。作业开始,然后在几分钟后失败。 emr-4.4.0、亚马逊 2.7.1、猪 0.14.0

我用不同的值尝试了这些命令,但问题仍然存在:

猪-Dmapreduce.map.java.opts=-Xmx2304m -Dmapred.child.java.opts=-Xmx3072m script.pig 猪-Dmapreduce.map.java.opts=-Xmx3328m -Dmapred.child.java.opts=-Xmx4096m -Dmapreduce.map.memory.mb=5120 script.pig

我的想法不多了……有什么建议吗?

2016-03-26 08:05:06,087 INFO [main] amazon.emr.metrics.MetricsSaver: 1 聚合 HDFSReadBytes 63 个原始值到 5 个聚合值,总共 5 2016-03-26 08:05:17,518 FATAL [main] org.apache.hadoop.mapred.YarnChild:运行子错误:java.lang.OutOfMemoryError:Java 堆空间 在 java.util.Arrays.copyOf(Arrays.java:2271) 在 org.apache.hadoop.io.Text.setCapacity(Text.java:266) 在 org.apache.hadoop.io.Text.append(Text.java:236) 在 org.apache.hadoop.util.LineReader.readDefaultLine(LineReader.java:243) 在 org.apache.hadoop.util.LineReader.readLine(LineReader.java:174) 在 org.apache.hadoop.mapreduce.lib.input.LineRecordReader.nextKeyValue(LineRecordReader.java:185) 在 org.apache.pig.builtin.TextLoader.getNext(TextLoader.java:58) 在 org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigRecordReader.nextKeyValue(PigRecordReader.java:204) 在 org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:565) 在 org.apache.hadoop.mapreduce.task.MapContextImpl.nextKeyValue(MapContextImpl.java:80) 在 org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.nextKeyValue(WrappedMapper.java:91) 在 org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:152) 在 org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:796) 在 org.apache.hadoop.mapred.MapTask.run(MapTask.java:342) 在 org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:172) 在 java.security.AccessController.doPrivileged(本机方法) 在 javax.security.auth.Subject.doAs(Subject.java:415) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657) 在 org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:166)

2016-03-26 08:05:17,621 INFO [main] org.apache.hadoop.metrics2.impl.MetricsSystemImpl:停止 MapTask 指标系统... 2016-03-26 08:05:17,622 信息 [cloudwatch] org.apache.hadoop.metrics2.impl.MetricsSinkAdapter:cloudwatch 线程中断。 2016-03-26 08:05:17,625 INFO [main] org.apache.hadoop.metrics2.impl.MetricsSystemImpl:MapTask 指标系统已停止。 2016-03-26 08:05:17,625 INFO [main] org.apache.hadoop.metrics2.impl.MetricsSystemImpl:MapTask 指标系统关闭完成。

【问题讨论】:

你能发布你的脚本吗? 【参考方案1】:

我找到了我遇到这个问题的原因。在我的文本文件中,我有几行带有这个字符 ^@^@^@^@^@^@^@^@^@^ 的行生成了很长的行。删除后就可以正常使用了

https://superuser.com/questions/75130/how-to-remove-this-symbol-with-vim

【讨论】:

以上是关于在 AWS EMR 上使用 pig 的 Java 堆空间的主要内容,如果未能解决你的问题,请参考以下文章

带有 tez 的 aws emr 上的 Pig 脚本偶尔会因 OutOfMemoryException 而失败

正在寻找将 aws pig 步骤注入已经运行的 emr 的 boto3 python 示例?

Pig 的“转储”在 AWS 上不起作用

Pig Script 上的多个 AWS 账户

在 EMR 上运行 Pig 脚本

从 Pig UDF Java 类、Amazon EMR 中的分布式缓存访问文件