1

我有一个 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 上运行。如果我们解压缩文件并将其用作输入,则一切正常。问题是我们有大量的压缩文件,不想到处解压。

我不确定我们的代码中是否缺少配置设置或布线。不知道如何进行。

4

1 回答 1

2

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

我不了解 EMR 上的 m1.large 实例规范,但是您可以尝试以下一些方法来避免此错误。

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

尝试的选项:

1)增加mapred.java.child.opts大小。这是子进程作为其单独的 JVM 进程获得的默认大小。默认情况下,它是 200mb ,对于任何合理的数据分析来说都是很小的。更改参数-XmxNu(N 的最大堆大小,以 u 为单位)和 -XmsNu (N 的初始堆大小,以 u 为单位)。尝试 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

最后,它是一种反复试验的方法,所以试着看看哪一个能坚持下去。

于 2014-05-06T17:03:18.547 回答