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

时间:2016-06-23 14:51:28

标签: hadoop hbase hdfs flume bigdata

我将有多个大小为10KB的小文本文件,混淆了将这些文件存储在HBase或HDFS中的位置。什么是优化存储? 因为要存储在HBase中,我需要先解析它,然后将其保存在某个行键中。 在HDFS中,我可以直接创建路径并将该文件保存在该位置。 但到目前为止,无论我读到什么,它都表示你不应该有多个小文件而是创建较少的大文件。 但是我无法合并这些文件,所以我无法用小文件创建大文件。

请建议。

3 个答案:

答案 0 :(得分:2)

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

有几种选项/策略可以最小化小文件的影响,所有选项都需要处理至少一次小文件并以更好的格式“打包”它们。如果您计划多次阅读这些文件,预处理小文件可能有意义,但如果您只使用这些文件一次,则无关紧要。

要处理小文件,我的意思是使用 CombineTextInputFormat (此处为示例):https://github.com/lalosam/HadoopInExamples/blob/master/src/main/java/rojosam/hadoop/CombinedInputWordCount/DriverCIPWC.java

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

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

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

答案 1 :(得分:2)

答案 2 :(得分:0)

拥有许多小的不同文件没有问题。例如,如果你在Hive中有一个表,hdfs中有许多非常小的文件,那么它不是最佳的,最好将这些文件合并到不太大的文件中,因为在阅读这个表时会创建很多映射器。如果您的文件完全不同,例如' apples'和'员工'并且不能合并而不仅仅是按原样存储它们。