Hadoop - 在reduce之后从输出文件中获取结果?

时间:2013-08-26 06:30:57

标签: hadoop mapreduce

给定map和reduce阶段的作业,我可以看到输出文件夹包含名为“part-r-00000”的文件。

如果我需要在应用程序级别对这些文件进行后处理,是否需要以自然命名顺序迭代输出文件夹中的所有文件(part-r-00000,part-r-00001,part-r-00002)。 ..)为了获得工作成果?

或者我可以使用一些hadoop帮助文件阅读器,这将允许我得到一些“迭代器”并为我处理文件切换(当文件part-r-00000被完全读取时,从文件part-r-00001继续) ?

3 个答案:

答案 0 :(得分:7)

您可以使用Hadoop文件系统(FS)shell的getmerge命令:

hadoop fs -getmerge /mapreduce/job/output/dir/ /your/local/output/file.txt

答案 1 :(得分:4)

在mapreduce中指定一个输出文件夹,它将包含的唯一内容是part-r文件(这是reduce任务的输出)和_SUCCESS文件(为空)。所以我认为如果你想进行后期处理,你只需要将job1的输出目录设置为作业2的输入目录。

现在您的后处理器可能有一些要求可以解决,例如按顺序处理输出文件是否很重要?

或者,如果您只想在本地处理文件,那么这一切都取决于mapreduce作业的outputformat,这将告诉您part-r文件的结构。然后你可以简单地使用标准的i / o。

答案 2 :(得分:1)

您可以使用Hadoop FileSystem从part-r-xxxxx文件的应用程序进行迭代。

FileSystem fs = FileSystem.get(new Configuration());
FileStatus[] status = fs.listStatus(new Path("hdfs://hostname:port/joboutputpath"));
for (int i=0;i<status.length;i++){
    fs.open(status[i].getPath())));
}

您还可以查看ChainMapper / ChainReducer。