在Hadoop映射器中获取总输入路径计数



我们试图获取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)中的配置中读出。

相关内容

  • 没有找到相关文章

最新更新