Hadoop MultipleOutputs.addNamedOutput 抛出"cannot find symbol"



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

这是我的配置方法:

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也被弃用。

如何使MultipleOutput工作?这是正确的类吗?

您正在混合新旧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一致,你应该可以

编辑:Infact 0.20.203没有新API的MultipleOutputs端口,因此您必须使用旧的API,在Cloudera-0.20.2+320上找到新的API端口,或自己移植

此外,您应该查看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的任何引用都将是原始conf。Job会对conf对象进行深度复制,因此调用MultipleOutputs.addNamedoutput(conf, ...)不会产生所需效果,请改用MultipleOutputs.addNamedoutput(job.getConfiguration(), ...)。请参阅上面的示例代码,了解正确的方法

相关内容

最新更新