2012-03-26 1 views
0

Hadoop 0.20.203.0을 사용하고 있습니다. 두 개의 다른 파일로 출력하고 싶습니다. 그래서 MultipleOutputs가 작동하도록하려고합니다.Hadoop MultipleOutputs.addNamedOutput throws "심볼을 찾을 수 없습니다"

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를 사용해 보았지만 동일한 오류가 발생합니다. 또한 JobConf는 더 이상 사용되지 않습니다.

어떻게하면 Multiple Outputs가 작동합니까? 그것도 올바른 클래스를 사용할 수 있습니까?

답변

3

당신은 이전 및 새 API 유형을 혼합하고 있습니다 :

당신은 기존의 API org.apache.hadoop.mapred.lib.MultipleOutputs 사용하고 있습니다 :

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를 확인 : 새로운 API org.apache.hadoop.mapreduce.lib.output.TextOutputFormat

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

을 일관성 있고 괜찮을거야

편집 : 또한

Infact는 0.20.203 새로운 API에 대한 MultipleOutputs의 포트가없는, 그래서 당신은 온라인 Cloudera- 0.20.2+320을 새로운 API 포트를 찾아, 기존의 API를 사용해야합니다), 또는 포트 스스로 , 당신은 명시 적으로 GenericOptionsParser를 호출 할 필요를 제거합니다, 당신의 작업을 실행하기 위해 ToolRunner 클래스를 보라 :

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; 
    } 
} 

최종 지점 - 대한 참조를 conf에 당신이 Job 인스턴스가 원래의 conf 될 것입니다 만든 후. 작업은 conf 객체의 전체 복사본을 만듭니다. 따라서 MultipleOutputs.addNamedoutput(conf, ...)을 호출하면 원하는 효과가 나타나지 않으므로 대신 MultipleOutputs.addNamedoutput(job.getConfiguration(), ...)을 사용하십시오. 위의 예제 코드를 참조하여 올바르게 수행하십시오.