我正在使用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
答案 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