给定map和reduce阶段的作业,我可以看到输出文件夹包含名为“part-r-00000”的文件。
如果我需要在应用程序级别对这些文件进行后处理,是否需要以自然命名顺序迭代输出文件夹中的所有文件(part-r-00000,part-r-00001,part-r-00002)。 ..)为了获得工作成果?
或者我可以使用一些hadoop帮助文件阅读器,这将允许我得到一些“迭代器”并为我处理文件切换(当文件part-r-00000被完全读取时,从文件part-r-00001继续) ?
答案 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。