【发布时间】:2026-01-04 19:35:01
【问题描述】:
一些机器的参数是通过网络服务测量并上传到HDFS的。每次测量的参数值都保存在一个文件中,其中一次测量平均有 1000 个值。
问题是 - 有大量文件。 MapReduce 作业仅使用一定数量的文件(例如,上个月的测量值)。因此,我无法将它们全部合并到一个大的序列文件中,因为在不同的时间需要不同的文件。
我知道拥有大量小文件是不好的,因为 NameNode 包含 HDFS 上所有这些文件的路径(并将其保存在其内存中),另一方面,每个小文件都会生成一个 Mapper创作。
如何避免这个问题?
【问题讨论】:
-
您是否尝试使用
CombineSequenceFileInputFormat?它应该将小文件合并为一个拆分并创建较少数量的映射器。文档:hadoop.apache.org/docs/stable/api/org/apache/hadoop/mapreduce/… -
说实话,我对 Hadoop 不是很有经验,但我知道这种方法可能存在一些问题。例如,对 HDFS 上所有文件的引用仍会保存在 NameNode 内存中,对吗?使用 CombineSequenceFileInputFormat 时是否还有其他问题?
-
是的,在 HDFS 中存储大量小文件是个坏主意。您可以每小时(或每天)将小文件合并为一个序列文件。如果您将使用文件的时间戳作为键和文件的内容作为值,那么在映射器中,您将能够过滤不包括在指定时间范围内的文件。
-
所以您建议运行 MapReduce 作业并仅从映射器发出指定范围内的文件?但是我仍然会遇到该工作的许多映射器任务的问题,我想这样的事情可以容忍吗?另一方面,我需要将原始文件保留在 HDFS 上,以便下次需要时合并它们,这将一直对 NameNode 产生影响。对此有何评论?如果没有更好的解决方案,我想我将不得不做类似的事情。您如何看待使用 HBase 或类似的东西按时间戳查询?会不会存在同样的问题?
-
你可以尝试 HAR(hadoop archive) 将小文件打包到单个归档中,以减少 NameNode 维护过多小文件的开销,并使用 CombineFileInputFormat over HAR 来限制调度的映射器数量。
标签: hadoop