我使用的是Hadoop 2.7.1和Java编码。我能够运行一个简单的mapreduce程序,在该程序中,我提供一个文件夹作为mapreduce程序的输入。
然而,我想使用一个文件(里面有完整的路径)作为输入;此文件包含要由mapper函数处理的所有其他文件。
以下是文件内容,
/allfiles.txt
- /tmp/aaa/file1.txt
- /tmp/bbb/file2.txt
- /tmp/ccc/file3.txt
如何将MapReduce程序的输入路径指定为一个文件,以便它可以开始处理里面的每个文件?谢谢
在驱动程序类中,您可以读取文件,并将每一行添加为一个文件进行输入:
//Read allfiles.txt and put each line into a List (requires at least Java 1.7)
List<String> files = Files.readAllLines(Paths.get("allfiles.txt"), StandardCharsets.UTF_8);
/Loop through the file names and add them as input
for(String file : files) {
//This Path is org.apache.hadoop.fs.Path
FileInputFormat.addInputPath(conf, new Path(file));
}
这是假设您的allfiles.txt
是运行MR作业的节点的本地,但如果allfiles.txt
实际上在HDFS上,这只是一个小变化。
我强烈建议您在将每个文件添加为输入之前,先检查HDFS上是否存在该文件。
您可以使用globs,而不是创建一个带有其他文件路径的文件。
在您的示例中,您可以将输入定义为-input /tmp/*/file?.txt