hadoop中多个小文件存放在什么地方最好

What is the best place to store multiple small files in hadoop

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

请多多指教。

拥有许多不同的小文件没有问题。例如,如果你在 Hive 中有一个 table,在 hdfs 中有许多非常小的文件,这不是最佳选择,最好将这些文件合并到较小的文件中,因为在读取这个 table 时会创建很多映射器.如果您的文件完全不同,例如 'apples' 和 'employees',并且无法合并,则只能按原样存储。

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

有几种options/strategies可以最大限度地减少小文件的影响,所有选项都需要至少处理一次小文件并"package"以更好的格式处理它们。如果您打算多次阅读这些文件,pre-process 小文件可能有意义,但如果您只使用这些文件一次,那就没关系了。

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

CombineTextInputFormat 使用一个 Mapper 来处理多个文件,但可能需要将文件传输到不同的 DataNode 以将文件放在地图所在的 DAtaNode 中 运行 并且 [=23 的性能可能很差=]推测性任务,但如果您的集群足够大,您可以禁用它们table。

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

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

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

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