org.apache.hadoop.mapred.YarnChild:运行child时出错:java.lang.OutOfMemoryError:Java堆空间

时间:2014-05-06 15:31:11

标签: hadoop emr snappy

我有一个90MB的snappy压缩文件,我试图在AWS EMR中将其用作AMI 3.0.4上的Hadoop 2.2.0的输入。

在尝试读取文件时,我的记录阅读器立即获得以下异常:

2014-05-06 14:25:34,210 FATAL [main] org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.OutOfMemoryError: Java heap space
at org.apache.hadoop.io.compress.BlockDecompressorStream.getCompressedData(BlockDecompressorStream.java:123)
at org.apache.hadoop.io.compress.BlockDecompressorStream.decompress(BlockDecompressorStream.java:98)
at org.apache.hadoop.io.compress.DecompressorStream.read(DecompressorStream.java:85)
at java.io.InputStream.read(InputStream.java:101)
at org.apache.hadoop.util.LineReader.readDefaultLine(LineReader.java:211)
at org.apache.hadoop.util.LineReader.readLine(LineReader.java:174)
at org.apache.hadoop.util.LineReader.readLine(LineReader.java:365)
...

我使用默认内存和io.sort.mb在AWS上运行m1.xlarge。如果我们解压缩文件并将其用作输入,那么一切都会好起来的。麻烦的是我们有大量的压缩文件,并且不想解压缩所有内容。

我不确定我们是否在某种类型的代码中缺少配置设置或接线。不知道如何继续。

1 个答案:

答案 0 :(得分:1)

根据您提供的日志,似乎解压缩块的大小超过您的可用堆大小。

我不知道关于EMR的m1.large实例规范,但是这里是你可以尝试避免这个错误的一些事情。

通常错误运行的孩子意味着,纱线产生的孩子无法找到足够的堆空间来继续其MR工作

选择尝试:

1)增加mapred.java.child.opts尺寸。它是子进程的默认大小,作为单独的JVM进程。默认情况下,它的200mb,对于任何合理的数据分析来说都很小。更改参数-XmxNu(以u为单位的N的最大堆大小)和 -XmsNu (以u为单位的初始堆大小为N)。尝试1Gb即-Xmx1g并查看效果,如果成功则变小(2)将mapred.child.ulimit设置为之前设置的最大堆大小的1.5或2倍。它设置进程的虚拟内存量。

3)减少mapred.tasktracker.map.tasks.maximummapred.tasktracker.reduce.tasks.maximum以设置一次运行的并行映射器和减速器的最大值。 />
4)io.sort.mb - 你已经尝试过了。试试0.25*mapred.child.java.opts < io.sort.mb < 0.5*mapred.child.java.opts

最后,它是一个试错法,所以试着看看哪一个坚持。