我们试图获取MapReduce程序在映射器中迭代的输入路径总数。我们将使用它和一个计数器来根据索引格式化我们的值。有没有一种简单的方法可以从映射器中提取总输入路径计数?提前谢谢。
您可以在源代码中查找FileInputFormat.getSplits()
- 这会拉回mapred.input.dir
的配置属性,然后将此 CSV 解析为路径数组。
这些路径仍然可以表示文件夹和正则表达式,因此getSplits()要做的下一件事是将数组传递给受保护的方法org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(JobContext)
。这实际上通过列出的目录/正则表达式并列出目录/正则表达式匹配文件(如果配置,也会调用PathFilter
)。
因此,通过保护此方法,您可以创建一个简单的 FileInputFormat 的"虚拟"扩展,该扩展具有 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中引入)
这是JIRA门票
输入路径的数量在作业中设置配置。 就像
jobConf.setInt("numberOfPaths",paths.length);
只需将代码放在配置作业的位置即可。之后,通过从上下文中获取它,将其从Mapper.setup(Mapper.Context context)
中的配置中读出。