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

dw1jzc5e  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(251)

我将有多个小的文本文件大小约10kb,有困惑在哪里存储这些文件在hbase或hdfs。什么是优化的存储?因为要存储在hbase中,我需要先解析它,然后根据某个行键保存它。在hdfs中,我可以直接创建一个路径并将该文件保存在该位置。但到目前为止,无论我读到什么,它说你不应该有多个小文件,而应该创建较小的文件。但是我不能合并那些文件,所以我不能用小文件创建大文件。
好心的建议。

mbyulnm0

mbyulnm01#

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

dzjeubhm

dzjeubhm2#

大量的小文件不存在´因为每个文件都是一个hdfs块,并且每个块在默认情况下都需要一个Map器来处理,所以不适合hadoop。
有几个选项/策略可以将小文件的影响降到最低,所有选项都要求至少处理一次小文件,并以更好的格式“打包”它们。如果您计划多次读取这些文件,预处理小文件可能是有意义的,但是如果您只使用这些文件一次,那么就没有意义了´没关系。
要处理小文件,我建议使用combinetextinputformat(这里是一个示例):https://github.com/lalosam/hadoopinexamples/blob/master/src/main/java/rojosam/hadoop/combinedinputwordcount/drivercipwc.java
combinetextinputformat使用一个Map器处理多个文件,但可能需要将文件传输到不同的datanode,以便将文件放在运行Map的datanode中,并且可能对推测性任务的性能很差,但如果群集足够稳定,则可以禁用这些文件。
重新打包小文件的替代方法是:
创建序列文件,其中每个记录包含一个小文件。使用此选项,您将保留原始文件。
使用identitymapper和identityreducer,其中减速器的数量小于文件的数量。这是最简单的方法,但要求文件中的每一行都相等且独立(而不是理解文件其余部分所需的文件开头的头或元数据)。
在配置单元中创建一个外部表,然后将此表的所有记录插入一个新表(插入到。从…中选择。这种方法与选项2有相同的局限性,并且需要使用hive,但是您不需要这样做´不需要写mapreduce。
如果不能像选项2或3那样合并文件,我的建议是使用选项1

iugsix8n

iugsix8n3#

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

相关问题