【问题标题】:Hadoop MultipleOutputs.addNamedOutput throws "cannot find symbol"Hadoop MultipleOutputs.addNamedOutput 抛出“找不到符号”
【发布时间】:2012-03-27 07:41:34
【问题描述】:

我正在使用 Hadoop 0.20.203.0。我想输出到两个不同的文件,所以我试图让 MultipleOutputs 工作。

这是我的配置方法:

public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();

String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2) {
  System.err.println("Usage: indycascade <in> <out>");
  System.exit(2);
}
Job job = new Job(conf, "indy cascade");
job.setJarByClass(IndyCascade.class);
job.setMapperClass(ICMapper.class);
job.setCombinerClass(ICReducer.class);
job.setReducerClass(ICReducer.class);

TextInputFormat.addInputPath(job, new Path(otherArgs[0]));
TextOutputFormat.setOutputPath(job, new Path(otherArgs[1]));

MultipleOutputs.addNamedOutput(conf, "sql", TextOutputFormat.class, LongWritable.class, Text.class);

job.waitForCompletion(true);
System.exit(job.waitForCompletion(true) ? 0 : 1);
}

但是,这不会编译。违规行是MultipleOutputs.addNamedOutput(...),它会引发“找不到符号”错误。

isaac/me/saac/i/IndyCascade.java:94: cannot find symbol
symbol  : method addNamedOutput(org.apache.hadoop.conf.Configuration,java.lang.String,java.lang.Class<org.apa che.hadoop.mapreduce.lib.output.TextOutputFormat>,java.lang.Class<org.apache.hadoop.io.LongWritable>,java.lang.Class<org.apache.hadoop.io.Text>)
location: class org.apache.hadoop.mapred.lib.MultipleOutputs
    MultipleOutputs.addNamedOutput(conf, "sql", TextOutputFormat.class, LongWritable.class, Text.class);

当然,我尝试按照 API 的要求使用 JobConf 而不是 Configuration,但这会导致同样的错误。此外,不推荐使用 JobConf。

如何让 MultipleOutputs 工作?这甚至是正确使用的类吗?

【问题讨论】:

    标签: java hadoop mapreduce


    【解决方案1】:

    您正在混合新旧 API 类型:

    您使用的是旧 API org.apache.hadoop.mapred.lib.MultipleOutputs

    location: class org.apache.hadoop.mapred.lib.MultipleOutputs
    

    使用新的 API org.apache.hadoop.mapreduce.lib.output.TextOutputFormat

    symbol  : method addNamedOutput(org.apache.hadoop.conf.Configuration,java.lang.String,java.lang.Class<org.apa che.hadoop.mapreduce.lib.output.TextOutputFormat>,java.lang.Class<org.apache.hadoop.io.LongWritable>,java.lang.Class<org.apache.hadoop.io.Text>)
    

    使 API 保持一致,你应该没问题

    编辑:事实上 0.20.203 没有用于新 API 的 MultipleOutputs 端口,因此您必须使用旧 api,在线查找新 API 端口 Cloudera- 0.20.2+320) ,或者自己移植

    此外,您应该查看 ToolRunner 类来执行您的作业,它将消除显式调用 GenericOptionsParser 的需要:

    public static class Driver extends Configured implements Tool {
      public static void main(String[] args) throws Exception {
        System.exit(ToolRunner.run(new Driver(), args));
      }
    
      public int run(String args[]) {
        if (args.length != 2) {
          System.err.println("Usage: indycascade <in> <out>");
          System.exit(2);
        }
    
        Job job = new Job(getConf());
        Configuration conf = job.getConfiguration();
    
        // insert other job set up here
    
        return job.waitForCompletion(true) ? 0 : 1;
      }
    }
    

    最后一点 - 创建 Job 实例后对 conf 的任何引用都将是原始配置。 Job 对 conf 对象进行了深拷贝,因此调用 MultipleOutputs.addNamedoutput(conf, ...) 不会有预期的效果,请改用 MultipleOutputs.addNamedoutput(job.getConfiguration(), ...)。请参阅上面的示例代码以了解正确的方法

    【讨论】:

      猜你喜欢
      • 2011-03-25
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多