我们正在尝试获取MapReduce程序正在我们的映射器中迭代的输入路径的总数。我们将使用它和一个计数器来根据索引格式化我们的值。有没有一种简单的方法可以从映射器中提取总输入路径数?提前致谢。
最佳答案
您可以浏览FileInputFormat.getSplits()
的源代码-这会拉回mapred.input.dir
的配置属性,然后将此CSV解析为路径数组。
这些路径仍然可以表示文件夹和正则表达式,因此getSplits()的下一步是将数组传递给 protected 方法org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(JobContext)
。这实际上遍历了dirs / regex列出的内容,并列出了目录/ regex匹配文件(如果已配置,还调用了PathFilter
)。
因此,在此方法 protected 情况下,您可以创建一个简单的FileInputFormat'dummy'扩展名,该扩展名具有listStatus方法,接受Mapper.Context作为其参数,然后包装对FileInputFormat.listStatus方法的调用:
public class DummyFileInputFormat extends FileInputFormat {
public List<FileStatus> listStatus(Context mapContext) throws IOException {
return super.listStatus(mapContext);
}
@Override
public RecordReader createRecordReader(InputSplit split,
TaskAttemptContext context) throws IOException,
InterruptedException {
// dummy input format, so this will never be called
return null;
}
}
编辑:实际上,
FileInputFormat
似乎已经为您完成了此工作,在getSplits()方法的末尾配置了作业属性mapreduce.input.num.files
(至少在1.0.2中,可能是在0.20.203中引入的)Here's the JIRA ticket
关于java - 获取Hadoop Mapper中的总输入路径计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10585560/