0

我们试图获取 MapReduce 程序在映射器中迭代的输入路径总数。我们将使用它和一个计数器来根据索引格式化我们的值。有没有一种简单的方法可以从映射器中提取总输入路径数?提前致谢。

4

2 回答 2

0

您可以查看源代码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 中引入)

这是 JIRA 票

于 2012-05-14T15:13:20.793 回答
0

您可以使用输入路径的数量在作业中设置配置。就像

jobConf.setInt("numberOfPaths",paths.length);

只需将代码放在您配置工作的地方。Mapper.setup(Mapper.Context context)之后,通过从上下文中获取它,将其从您的配置中读取出来。

于 2012-05-14T15:20:10.017 回答