hadoop:提供目录作为mapreduce作业的输入

uajslkp6  于 2021-06-04  发布在  Hadoop
关注(0)|答案(4)|浏览(389)

我正在使用cloudera hadoop。我能够运行简单的mapreduce程序,在这里我提供一个文件作为mapreduce程序的输入。
此文件包含Map器函数要处理的所有其他文件。
但是,我有一次被困住了。

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

如何将mapreduce程序的输入路径指定为 "/folder1" ,以便它可以开始处理该目录中的每个文件?
有什么想法吗?
编辑:
1) 最初,我提供inputfile.txt作为mapreduce程序的输入。它工作得很好。

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

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

hadoop jar ABC.jar /folder1 /output
daolsyd0

daolsyd01#

问题是fileinputformat不能递归地读取输入路径dir中的文件。
解决方案:使用以下代码 FileInputFormat.setInputDirRecursive(job, true); 在Map的下面一行之前减少代码 FileInputFormat.addInputPath(job, new Path(args[0])); 你可以在这里检查它被修复的版本。

h6my8fg2

h6my8fg22#

使用multipleinputs类。

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

看看工作代码

r6hnlfcb

r6hnlfcb3#

您可以使用filesystem.liststatus从给定的dir获取文件列表,代码如下:

//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());
    }
}
ecbunoof

ecbunoof4#

您可以使用hdfs通配符来提供多个文件
所以,解决方案是:

hadoop jar ABC.jar /folder1/* /output

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

相关问题