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