【问题标题】:Hadoop MapReduce Out of Memory on Small FilesHadoop MapReduce 小文件内存不足
【发布时间】: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


    【解决方案1】:

    我会启动一个新的 EMR 集群,然后向它抛出一个更大的主实例,看看这是否是问题所在。

    --instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=m3.4xlarge InstanceGroupType=CORE,InstanceCount=1,InstanceType=m3.xlarge
    

    如果在配置输入拆分时主服务器内存不足,您可以修改配置 EMR Configuration

    【讨论】:

    • 感谢您的反馈。不过,我不确定在哪里增加内存限制。显然,不适用于减速机。但是对于映射器呢?输入拆分是否在映射器容器中计算?或者该工作是否存在生态系统的另一部分(基于CombineFileInputFormat的源代码,它似乎都在线程上,所以我认为它可能在主实例的某个容器中。我还没有找到一个允许访问更多内存的设置......(它在一个 c3.8xlarge 实例上 w/60 gigs 的 RAM,所以它应该有相当多的空间,但也许不是......)
    • 拆分是在主节点上运行的客户端应用程序中计算的。默认情况下,Hadoop 为客户端提供 1G (HADOOP_HEAPSIZE),因此可能需要对其进行调整。这可以通过 hadoop-env 属性进行调整,类似于docs.aws.amazon.com/ElasticMapReduce/latest/ReleaseGuide/… 中的示例。
    • 你是一个绅士和一个学者。我试试这个,让你知道会发生什么。
    • 增加HADOOP_HEAPSIZE 就行了。即使在小型集群上,该作业也可以在几分钟内执行。谢谢!
    【解决方案2】:

    您可以使用以下任何一种方法将它们合并为可管理的更大文件,而不是对 300 万个单独的文件运行 MapReduce。 1. 从小文件创建 Hadoop 存档 (HAR) 文件。 2. 使用 MapReduce 程序为每 10K-20K 文件创建序列文件。 3. 使用 forqlift 工具从您的各个小文件创建一个序列文件。 4. 使用 Hadoop-Crush 将您的小文件合并成更大的文件。

    准备好更大的文件后,您可以在整个数据集上运行 MapReduce。

    【讨论】:

    • 感谢您的反馈。虽然我很感激这些帮助,但这些解决方案之所以具有挑战性,有两个原因。 1)由于我们的数据存在一些长期存在的问题,我们需要保留文件名(例如,我意识到这并不排除序列文件,但它确实排除了一些事情)。 2) 主节点内存不足,试图计算拆分以将所有这些文件交给 FileCrush 或序列文件映射器……(尽管,希望 ChristopherB 关于堆大小的建议对此有所帮助……)
    猜你喜欢
    • 1970-01-01
    • 2012-06-16
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    相关资源
    最近更新 更多