hadoop mapreduce小文件内存不足

njthzxwz  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(390)

我正在hadoop上对大约300万个小文件运行mapreduce作业(我知道,我知道,但我们对此无能为力——这是源系统的本质)。
我们的代码没有什么特别之处-它使用 CombineFileInputFormat 将这些文件打包在一起,然后解析文件名以将其添加到文件的内容中,并输出一些结果。简单的豌豆。
因此,我们有大约300万~7kb的文件 HDFS . 如果我们对这些文件的一小部分(一个文件夹,也许10000个文件)运行任务,我们就不会有麻烦。如果我们在完整的文件列表上运行它,就会出现内存不足错误。
错误出现在 STDOUT :


# 

# java.lang.OutOfMemoryError: GC overhead limit exceeded

# -XX:OnOutOfMemoryError="kill -9 %p"

# Executing /bin/sh -c "kill -9 15690"...

我假设发生的事情是这样的——无论jvm运行的是什么定义输入分割的进程,在处理300万个文件时都会变得不知所措,它占用了太多内存,而且 YARN 是在扼杀它。我愿意被纠正这个理论。
所以,我需要知道的是如何增加 YARN 对于计算输入拆分的容器,而不是Map器或还原器。那么,我需要知道如何使它生效(我在google上搜索了很多,但是随着hadoop多年来的迭代,很难找到一个适用于最新版本的解决方案……)
这是hadoop2.6.0,在aws弹性mapreduce4.2.0上使用mapreduceapi,yarn框架。

vcirk6k6

vcirk6k61#

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

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

如果配置输入拆分时主机内存不足,可以修改配置emr配置

aiazj4mn

aiazj4mn2#

不需要在300万个单独的文件上运行mapreduce,您可以使用以下任何方法将它们合并到可管理的更大的文件中。1从小文件创建hadoop归档(har)文件。2使用mapreduce程序为每个10k-20k文件创建序列文件。三。使用forqlift工具从单个小文件创建序列文件。4使用hadoopcrush将小文件合并成大文件。
一旦准备好了更大的文件,就可以在整个数据集上运行mapreduce。

相关问题