我将有多个大小为10KB的小文本文件,混淆了将这些文件存储在HBase或HDFS中的位置。什么是优化存储? 因为要存储在HBase中,我需要先解析它,然后将其保存在某个行键中。 在HDFS中,我可以直接创建路径并将该文件保存在该位置。 但到目前为止,无论我读到什么,它都表示你不应该有多个小文件而是创建较少的大文件。 但是我无法合并这些文件,所以我无法用小文件创建大文件。
请建议。
答案 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中,并且可能在推测任务时表现不佳但如果您的群集足够稳定,您可以禁用它们。
重新包装小文件的替代方法是:
如果您无法合并选项2或3中的文件,我建议使用选项1
答案 1 :(得分:2)
答案 2 :(得分:0)
拥有许多小的不同文件没有问题。例如,如果你在Hive中有一个表,hdfs中有许多非常小的文件,那么它不是最佳的,最好将这些文件合并到不太大的文件中,因为在阅读这个表时会创建很多映射器。如果您的文件完全不同,例如' apples'和'员工'并且不能合并而不仅仅是按原样存储它们。