2012-05-14 37 views
0

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

回答

0

您可以通过源代码查看FileInputFormat.getSplits() - 这将拉回mapred.input.dir的配置属性,然后将此CSV解析为一组路径。

这些路径仍然可以代表文件夹和正则表达式,因此getSplits()所做的下一件事是将数组传递给受保护的方法org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(JobContext)。这实际上是通过dirs/regex列出的,并列出目录/正则表达式匹配文件(如果已配置,也会调用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()方法(至少在1.0.2,大概在0.20推出的最后配置作业属性mapreduce.input.num.files。 203)

Here's the JIRA ticket

+0

基督我得到了一个输入路径没有发现异常,当我尝试这一点。输入路径肯定存在。 –

+0

你可以发布整个堆栈跟踪(pastebin或soem这样的地方,使格式更容易) –

+0

克里斯,我很抱歉,我们实现了一个自定义FileInputFormat,执行递归跟踪。您的解决方案奏效再次感谢! –

0

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

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

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

相关问题