获取Hadoop Mapper中的总输入路径计数

时间:2012-05-14 14:42:09

标签: java hadoop mapreduce

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

2 个答案:

答案 0 :(得分:0)

您可以浏览FileInputFormat.getSplits()的来源 - 这会拉回mapred.input.dir的配置属性,然后将此CSV解析为路径数组。

这些路径仍然可以表示文件夹和正则表达式,因此getSplits()所做的下一件事就是将数组传递给受保护的方法org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(JobContext)。这实际上是通过列出的目录/正则表达式列出并列出目录/正则表达式匹配文件(如果已配置,也会调用PathFilter。)

所以这个方法受到保护,你可以创建一个FileInputFormat的简单“虚拟”扩展,它有一个listStatus方法,接受Mapper.Context作为它的参数,然后包装一个对FileInputFormat.listStatus方法的调用: / p>

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

答案 1 :(得分:0)

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

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

只需将代码放在配置作业的位置即可。之后,通过从上下文中获取它,从Mapper.setup(Mapper.Context context)中的配置中读出它。