我有一个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。如果我们解压缩文件并将其用作输入,那么一切都会好起来的。麻烦的是我们有大量的压缩文件,并且不想解压缩所有内容。
我不确定我们是否在某种类型的代码中缺少配置设置或接线。不知道如何继续。
答案 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.maximum
和mapred.tasktracker.reduce.tasks.maximum
以设置一次运行的并行映射器和减速器的最大值。 />
4)io.sort.mb
- 你已经尝试过了。试试0.25*mapred.child.java.opts < io.sort.mb < 0.5*mapred.child.java.opts
。
最后,它是一个试错法,所以试着看看哪一个坚持。