2012-08-14 3 views
3

해결책 : 더 나은 tutorial- http://hadoop.apache.org/mapreduce/docs/r0.22.0/mapred_tutorial.htmlHadoop MapReduce를 처음 사용하여 mapred.Reducer에서 NoSuchMethodException을 얻습니다. <init>()

난 그냥 맵리 듀스 작업을 시작하고, 내가 Google을 통해 응답 할 수 없었던 이상한 버그 실행 해요. 나는 기본적인 단어 수 프로그램을 만들고 있어요,하지만 난 그것을 실행할 때, 나는 동안 다음과 같은 오류가 감소 :

java.lang.RuntimeException: java.lang.NoSuchMethodException: org.apache.hadoop.mapred.Reducer.<init>() 
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:115) 
at org.apache.hadoop.mapred.ReduceTask.runOldReducer(ReduceTask.java:485) 
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:420) 
at org.apache.hadoop.mapred.Child$4.run(Child.java:255) 
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:1121) 
at org.apache.hadoop.mapred.Child.main(Child.java:249) 

단어 수 프로그램은 아파치 맵리 듀스 튜토리얼의 하나입니다. 마운틴 라이온의 가상 분산 모드에서 Hadoop 1.0.3을 실행 중입니다. 예제는 모두 정상적으로 실행되기 때문에 정상적으로 작동한다고 생각합니다. 어떤 아이디어?

편집 : 여기 참조를 위해 내 코드입니다 :

package mrt; 

import java.io.IOException; 
import java.util.*; 

import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.conf.*; 
import org.apache.hadoop.io.*; 
import org.apache.hadoop.mapred.*; 
import org.apache.hadoop.util.*; 

public class WordCount { 
public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> { 

    private final static IntWritable one = new IntWritable(1); 
    private Text word = new Text(); 

    public void map(LongWritable key, Text value, OutputCollector<Text,IntWritable> output, Reporter reporter) 
     throws IOException{ 

     String line = value.toString(); 
     StringTokenizer tokenizer = new StringTokenizer(line); 
     while(tokenizer.hasMoreTokens()){ 
      word.set(tokenizer.nextToken()); 
      output.collect(word,one); 
     } 
    } 
} 

public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> { 

    public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) 
     throws IOException{ 

     int sum = 0; 

     while(values.hasNext()){ 
      sum += values.next().get(); 
     } 

     output.collect(key, new IntWritable(sum)); 

    } 
} 

public static void main(String[] args) throws Exception{ 

    JobConf conf = new JobConf(WordCount.class); 
    conf.setJobName("Wordcount"); 

    conf.setOutputKeyClass(Text.class); 
    conf.setOutputValueClass(IntWritable.class); 

    conf.setMapperClass(Map.class); 
    conf.setCombinerClass(Reduce.class); 
    conf.setReducerClass(Reducer.class); 

    conf.setInputFormat(TextInputFormat.class); 
    conf.setOutputFormat(TextOutputFormat.class); 

    FileInputFormat.setInputPaths(conf, new Path(args[0])); 
    FileOutputFormat.setOutputPath(conf, new Path(args[1])); 

    JobClient.runJob(conf); 

} 
} 

답변

8

문제는 API를 선택하지 않았습니다. 안정적인 (mapred. *) API와 진화하는 API (mapreduce. *)는 모두 완벽하게 지원되며 프레임 워크 자체는 릴리스 간의 회귀/손상을 방지하기위한 테스트를 수행합니다. 대신 감속기 인터페이스의 구현을 설정해야 할 때

conf.setReducerClass(Reducer.class); 

당신은, 감속기 거기 감속기 인터페이스를 설정하는 :

문제는이 라인입니다. 변경 대상 :

conf.setReducerClass(Reduce.class); 

수정 예정입니다.

+0

이클립스의 자동 완성에 대해 감사 할 수 있습니다. – HypnoticSheep

1

점검 대신 hadoop.mapred 패키지의 hadoop.mapreduce 패키지를 사용하고 있는지 확인합니다. 맵핑 된 패키지는 이전 버전이며 현재 버전 mapreduce 클래스보다 클래스에 대해 다른 메소드를 가지고 있습니다.

+0

자습서에서 사용한 것이므로 현재 hadoop.mapred 패키지를 사용하고 있습니다. hadoop.mapreduce로 전환하면 MapReduceBase, Mapper, Reducer 및 기타 오류가 발생합니다. 스위치가 필요합니까, 아니면 hadoop.mapred가 여전히 작동합니까? – HypnoticSheep

+0

패키지 작업은 단일 작업 내에서 일관성이 있어야합니다. 모든 것이 일치하면 답을 철회 할 것입니다. –

+0

실제로지도 작성된 패키지가 더 이상 작동하지 않습니다. mapreduce 패키지를 사용하는 최신 튜토리얼을 찾을 수 있었지만, 아파치 사이트의 기본값이 아닌 이유는 알 수 없습니다. 어쨌든 그것은 작동합니다. 감사! – HypnoticSheep