我的mapreduce工作之一是使用MultipleInputs。工作完成后,我想删除输入文件。不幸的是,MultipleInputs有一个非常有限的API,并且不提供FileInputFormat FileInputFormat.getInputPaths()
的功能。
查看了Hadoop的源代码,看起来我应该能够从mapreduce.input.multipleinputs.dir.formats
获得所有路径,但这对我来说总是空的。
当然,我可以将所有输入路径存储在"一侧"的某个地方,但我相信一定有一种方法可以从Hadoops API获取它。
for(Path path : getParsedSitesToMerge(conf, crawlPath)) {
MultipleInputs.addInputPath(job, path, SequenceFileInputFormat.class, InjectLinkMapper.class);
System.out.println(path.toString());
System.out.println(MultipleInputs.DIR_FORMATS + ": " + conf.get(MultipleInputs.DIR_FORMATS));
}
输出
file:/tmp/crawl1/link_db/links/parsed_1420300287148
mapreduce.input.multipleinputs.dir.formats: null
file:/tmp/crawl1/link_db/links/parsed_1420300308993
mapreduce.input.multipleinputs.dir.formats: null
请参阅MultipleInputs的这部分代码:
public static final String DIR_FORMATS = "mapreduce.input.multipleinputs.dir.formats";
public static void addInputPath(Job job, Path path,
Class<? extends InputFormat> inputFormatClass) {
String inputFormatMapping = path.toString() + ";" + inputFormatClass.getName();
Configuration conf = job.getConfiguration();
String inputFormats = conf.get(DIR_FORMATS);
conf.set(DIR_FORMATS,
inputFormats == null ? inputFormatMapping : inputFormats + ","
+ inputFormatMapping);
job.setInputFormatClass(DelegatingInputFormat.class);
}
您可以使用String mappers = conf.get("mapreduce.input.multipleinputs.dir.formats");
来获取所有路径,只要您从驱动程序代码中说addInputPath,就会从上面的代码中添加这些路径。