如何使用文件(里面许多文件的完整路径)作为MapReduce作业的输入



我使用的是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

相关内容

  • 没有找到相关文章

最新更新