10

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

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

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

4

3 回答 3

9

您可以使用 Hadoop File System(FS) shell 的 getmerge 命令:

hadoop fs -getmerge /mapreduce/job/output/dir/ /your/local/output/file.txt
于 2013-08-26T07:02:27.193 回答
5

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

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

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

于 2013-08-26T06:57:08.937 回答
2

您可能可以使用 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。

于 2013-08-26T08:05:28.930 回答