Hadoop:提供目录作为MapReduce作业的输入

时间:2013-11-20 11:13:45

标签: java hadoop input mapreduce cloudera

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

此文件包含mapper函数要处理的所有其他文件。

但是,我一度陷入困境。

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

如何将MapReduce程序的输入路径指定为"/folder1",以便它可以开始处理该目录中的每个文件?

有什么想法吗?

编辑:

1)Intiailly,我提供了inputFile.txt作为mapreduce程序的输入。它运作得很好。

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

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

hadoop jar ABC.jar /folder1 /output

4 个答案:

答案 0 :(得分:13)

问题是FileInputFormat没有在输入路径dir中递归读取文件。

解决方案:使用以下代码

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

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

您可以查看here修复的版本。

答案 1 :(得分: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());
    }
}

答案 2 :(得分:1)

您可以使用hdfs wildcards来提供多个文件

所以,解决方案:

hadoop jar ABC.jar /folder1/* /output

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

答案 3 :(得分:0)

使用MultipleInputs课程。

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

查看工作code