如何使Hadoop Map在一次运行中减少处理多个文件?

如何使Hadoop Map在一次运行中减少处理多个文件?,hadoop,Hadoop,对于Hadoop Map Reduce程序,当我们通过执行以下命令$Hadoop jar my.jar DriverClass input1.txt hdfsDirectory来运行它时。如何使Map Reduce在一次运行中处理多个文件input1.txt和input2.txt 像这样: hadoop jar my.jar DriverClass hdfsInputDir hdfsOutputDir 在哪里 hdfsInputDir是HDFS上存储输入文件的路径,即input1.txt和i

对于Hadoop Map Reduce程序,当我们通过执行以下命令$Hadoop jar my.jar DriverClass input1.txt hdfsDirectory来运行它时。如何使Map Reduce在一次运行中处理多个文件input1.txt和input2.txt

像这样:

hadoop jar my.jar DriverClass hdfsInputDir hdfsOutputDir 
在哪里

hdfsInputDir是HDFS上存储输入文件的路径,即input1.txt和input2.txt的父目录 hdfsOutputDir是HDFS上存储输出的路径。在运行此命令之前,该路径不应存在。 请注意,在运行此命令之前,应在HDFS上复制输入。 要将其复制到HDFS,可以运行:

hadoop dfs -copyFromLocal localPath hdfsInputDir

这是您的小文件问题。对于每个文件,映射程序都将运行

小文件是一个明显小于HDFS块大小默认值64MB的文件。如果你存储的是小文件,那么你可能有很多,否则你就不会求助于Hadoop,问题是HDFS不能处理很多文件

HDFS中的每个文件、目录和块都表示为namenode内存中的一个对象,根据经验,每个对象占用150字节。因此,1000万个文件,每个使用一个块,将使用大约3 GB的内存。扩展远远超出此级别是当前硬件的一个问题。当然,10亿个文件是不可行的

解决方案

HAR文件

Hadoop档案HAR文件在0.18.0中引入HDFS,以缓解大量文件对namenode内存造成压力的问题。HAR文件通过在HDFS之上构建分层文件系统来工作。HAR文件是使用hadoop archive命令创建的,该命令运行MapReduce作业,将要归档的文件打包到少量HDFS文件中。对于使用HAR文件系统的客户机,没有任何更改:所有原始文件都是可见和可访问的,尽管使用的是HAR://URL。但是,HDFS中的文件数量已经减少

序列文件


对于有关“小文件问题”的问题,通常的回答是:使用SequenceFile。这里的想法是使用文件名作为键,文件内容作为值。这在实践中效果很好。回到10000个100KB的文件,您可以编写一个程序将它们放入一个SequenceFile中,然后您可以直接以流式方式或使用MapReduce对SequenceFile进行处理。还有一些奖金。SequenceFile是可拆分的,因此MapReduce可以将它们拆分为块,并独立地对每个块进行操作。与HARs不同,它们也支持压缩。在大多数情况下,块压缩是最好的选择,因为它压缩多个记录的块,而不是每个记录。

你是说输入*.txt还是像1.txt、2、txt这样的少数文件?我是说1.txt、2.txt、…@user2192023答案对你有用吗?