在hadoop中存储多个小文件的最佳位置是啥

Posted

技术标签:

【中文标题】在hadoop中存储多个小文件的最佳位置是啥【英文标题】:What is the best place to store multiple small files in hadoop在hadoop中存储多个小文件的最佳位置是什么 【发布时间】:2016-06-23 14:51:27 【问题描述】:

我将拥有多个大小约为 10KB 的小文本文件,我很困惑将这些文件存储在 HBase 或 HDFS 中的何处。什么是优化的存储? 因为要存储在 HBase 中,我需要先对其进行解析,然后将其保存为某个行键。 在 HDFS 中,我可以直接创建一个路径并将该文件保存在该位置。 但到目前为止,无论我读到什么,它都说你不应该有多个小文件,而是创建更少的大文件。 但是我不能合并这些文件,所以我不能用小文件创建大文件。

请提出建议。

【问题讨论】:

【参考方案1】:

大量的小文件不太适合 hadoop,因为每个文件都是一个 hdfs 块,并且每个块默认需要一个 Mapper 来处理。

有几个选项/策略可以最大限度地减少小文件的影响,所有选项都需要处理至少一次小文件并以更好的格式“打包”它们。如果您打算多次阅读这些文件,预处理小文件可能是有意义的,但如果您只使用这些文件一次,那就没关系了。

要处理小文件,我的建议是使用 CombineTextInputFormat(这里是一个示例):https://github.com/lalosam/HadoopInExamples/blob/master/src/main/java/rojosam/hadoop/CombinedInputWordCount/DriverCIPWC.java

CombineTextInputFormat 使用一个 Mapper 来处理多个文件,但可能需要将文件传输到不同的 DataNode 以将文件放在运行地图的 DAtaNode 中,并且可能会在推测性任务中表现不佳但如果您的集群足够稳定,您可以禁用它们。

重新打包小文件的替代方法是:

    创建序列文件,其中每条记录都包含一个小文件。使用此选项,您将保留原始文件。 在 reducer 的数量少于文件的数量时使用 IdentityMapper 和 IdentityReducer。这是最简单的方法,但要求文件中的每一行都相等且独立(不是文件开头的标题或元数据,以了解文件的其余部分)。 在 hive 中创建一个外部表,然后将该表的所有记录插入到一​​个新表中(INSERT INTO ... SELECT FROM ...)。这种方法与选项 2 具有相同的限制,并且需要使用 Hive,其优点是您不需要编写 MapReduce。

如果您无法像选项 2 或 3 那样合并文件,我的建议是使用选项 1

【讨论】:

【参考方案2】:

您可以尝试使用 HAR 存档:https://hadoop.apache.org/docs/r2.7.2/hadoop-archives/HadoopArchives.html

【讨论】:

【参考方案3】:

拥有许多不同的小文件没有问题。例如,如果您在 Hive 中有一个表,在 hdfs 中有许多非常小的文件,那么最好将这些文件合并到较小的文件中,因为在读取此表时会创建很多映射器。如果您的文件与“apples”和“employees”完全不同,并且无法合并,则只能按原样存储它们。

【讨论】:

以上是关于在hadoop中存储多个小文件的最佳位置是啥的主要内容,如果未能解决你的问题,请参考以下文章

以下使用 Hadoop 生态系统的用例的最佳方法是啥?

在 Rails 应用程序中存储 Configatron 配置的正确/最佳位置是啥?

将Java应用程序数据冗余存储在文件中的最佳方法是啥?

微信啥小程序可以发公告文章

请问hadoop的hdfs文件系统和本地windows文件系统或linux文件系统是啥关系啊,谢谢

望正接收器用微信啥小程序