2013-11-20 499 views
6

我正在使用Cloudera Hadoop。我能够运行简单的mapreduce程序,我提供一个文件作为MapReduce程序的输入。Hadoop:提供目录作为MapReduce作业的输入

此文件包含要由映射器函数处理的所有其他文件。

但是,我被困在一个点上。

/folder1 
    - file1.txt 
    - file2.txt 
    - file3.txt 

我怎么能指定输入路径的MapReduce程序为"/folder1",使之可以开始处理该目录内的每个文件?

任何想法?

编辑:

1)Intiailly,我提供的inputFile.txt作为输入到映射精简程序。它工作完美。

>inputFile.txt 
file1.txt 
file2.txt 
file3.txt 

2)但是现在,我不想给一个输入文件,我想在命令行上提供一个输入目录作为arg [0]。

hadoop jar ABC.jar /folder1 /output 
+0

你是如何提交/创建工作吗? –

+0

检查编辑..... –

+0

是的,就是这样工作,你的问题是什么? –

回答

2

你可以使用FileSystem.listStatus获得从给定目录的文件列表,代码可能是如下:

//get the FileSystem, you will need to initialize it properly 
FileSystem fs= FileSystem.get(conf); 
//get the FileStatus list from given dir 
FileStatus[] status_list = fs.listStatus(new Path(args[0])); 
if(status_list != null){ 
    for(FileStatus status : status_list){ 
     //add each file to the list of inputs for the map-reduce job 
     FileInputFormat.addInputPath(conf, status.getPath()); 
    } 
} 
+0

添加路径后,我们如何在地图作业中访问它?它会直接返回文件的内容吗? –

11

问题是FileInputFormat不输入路径目录递归读取文件。

解决方案:使用以下代码

FileInputFormat.setInputDirRecursive(job, true);在地图下方前行减少代码

FileInputFormat.addInputPath(job, new Path(args[0]));

您可以检查here为此版本,它是固定的。

1

可以使用HDFS wildcards以提供多个文件,

因此,解决方法:

hadoop jar ABC.jar /folder1/* /output 

hadoop jar ABC.jar /folder1/*.txt /output 
0

使用MultipleInputs类。

MultipleInputs. addInputPath(Job job, Path path, Class<? extends InputFormat> 
inputFormatClass, Class<? extends Mapper> mapperClass) 

看一看工作code

相关问题