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

时间:2014-11-02 10:19:21

标签: hadoop

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

2 个答案:

答案 0 :(得分:0)

就像那样:

hadoop jar my.jar DriverClass hdfsInputDir hdfsOutputDir 

其中

  • hdfsInputDir是HDFS上存储输入文件的路径(即input1.txtinput2.txt的父目录)
  • hdfsOutputDir是HDFS上存储输出的路径(在运行此命令之前不应该存在)。

请注意,在运行此命令之前,应将输入复制到HDFS上。 要将其复制到HDFS,您可以运行:

hadoop dfs -copyFromLocal localPath hdfsInputDir

答案 1 :(得分:0)

这是您的小文件问题。每个文件映射器都会运行。

小文件是一个明显小于HDFS块大小的文件(默认为64MB)。如果你要存储小文件,那么你可能有很多文件(否则你不会转向Hadoop),问题是HDFS无法处理大量文件。

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

<强>溶液

HAR文件

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

序列文件

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