在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中存储多个小文件的最佳位置是啥的主要内容,如果未能解决你的问题,请参考以下文章
在 Rails 应用程序中存储 Configatron 配置的正确/最佳位置是啥?