【发布时间】:2015-11-20 19:26:08
【问题描述】:
我正在针对 Hadoop 上的大约 300 万个小文件运行 MapReduce 作业(我知道,我知道,但我们对此无能为力 - 这是我们源系统的本质)。
我们的代码没有什么特别之处——它使用CombineFileInputFormat 将一堆这些文件包装在一起,然后解析文件名以将其添加到文件的内容中,并输出一些结果。轻松愉快。
所以,我们在HDFS 中有大约 300 万个 ~7kb 文件。如果我们针对这些文件的一小部分(一个文件夹,可能是 10,000 个文件)运行我们的任务,我们就不会遇到麻烦。如果我们针对完整的文件列表运行它,则会出现内存不足错误。
错误出现在STDOUT:
#
# java.lang.OutOfMemoryError: GC overhead limit exceeded
# -XX:OnOutOfMemoryError="kill -9 %p"
# Executing /bin/sh -c "kill -9 15690"...
我假设正在发生的事情是这样的——无论 JVM 正在运行定义输入拆分的进程,都在试图处理 300 万个文件时完全不堪重负,它使用了太多内存,YARN 正在杀死它。我愿意纠正这个理论。
所以,我需要知道如何为计算输入拆分的容器增加 YARN 的内存限制,而不是为映射器或减速器增加内存限制。然后,我需要知道如何使它生效。 (我已经在 Google 上进行了大量搜索,但是多年来 Hadoop 的所有迭代,很难找到适用于最新版本的解决方案......)
这是 Hadoop 2.6.0,在 AWS Elastic MapReduce 4.2.0 上使用 MapReduce API、YARN 框架。
【问题讨论】:
标签: java hadoop amazon-web-services mapreduce elastic-map-reduce