Hadoop MultipleInputs因RuntimeException而失败

时间:2014-09-08 19:01:12

标签: java hadoop mapreduce

我的现有系统从特定文件夹中读取所有文件,并在其上运行MapReduce。代码如下:

    Path path = new Path(inputPath)
    if (!FileSystem.get(conf).exists(path)) {
      System.out.println("Path does not exist (skipping): " + path);
      return 1;
    }
    FileInputFormat.setInputPaths(conf, inputPath);

这没有任何问题。现在,最近的文件更改要求我指定要用作输入的文件。我把代码更改为:

for(String fileName:filePath.split(",")){
   MultipleInputs.addInputPath(conf, new Path(fileName), TextInputFormat.class, RawLogMapper.class);
   // MultipleInputs.addInputPath(conf, new Path(fileName), TextInputFormat.class);
}

其中filePath是需要处理的绝对文件路径的逗号分隔列表。 我使用的是mapred,而不是mapreduce。

import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapred.TextInputFormat;
import org.apache.hadoop.mapred.lib.MultipleInputs;
import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat;

更改代码后,我遇到以下错误:

14/09/08 13:50:05 INFO mapred.JobClient: Task Id : attempt_201408201501_1196_m_000000_1, Status : FAILED
java.lang.RuntimeException: Error in configuring object
    at org.apache.hadoop.util.ReflectionUtils.setJobConf(ReflectionUtils.java:109)
    at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:75)
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:133)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:413)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:332)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:268)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1438)
    at org.apache.hadoop.mapred.Child.main(Child.java:262)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.ja

不确定是否因为我没有指定TextInputFormat,我将该部分添加到addInputPath函数,并且错误仍然存​​在。

修改

发现问题。 在映射器的下游进行了一次调用

String filename = conf.get("map.input.file");
pos = conf.get((new File(filename)).getName().split("-")[0]);

当我指定文件时,文件名将返回null,而不是指定文件夹,因此返回NPE。我想知道为什么在指定输入文件时conf.get(" map.input.file")。

https://issues.apache.org/jira/browse/MAPREDUCE-1743

这意味着,我需要在运行配置时知道文件的名称:

  1. 不使用conf.get(" map.input.file")
  2. 不使用((FileSplit) context.getInputSplit()).getPath().toString();,因为我使用的是mapred而不是mapreduce。
  3. public void configure(JobConf conf) {
      String filename = conf.get("map.input.file");
      merchant = conf.get((new File(filename)).getName().split("-")[0]);
      if (merchant == null) {
        merchant = "unknown_merchant";
      }
    }
    

    非常感谢您解决此问题的任何输入。

    谢谢, 杰文

1 个答案:

答案 0 :(得分:1)

使用

FileInputFormat.addInputPath(conf, new Path(fileName));

一切看起来都不错。