2013-04-14 4 views
0

hadoop에서 첫 번째 프로그램을 실행할 때이 예외가 발생합니다. (나는 0.20.2 버전에서 hadoop 새로운 API를 사용하고있다). 웹에서 검색 한 결과 대부분의 사람들이 MapperClass 및 ReducerClass를 구성 논리에 설정하지 않았을 때이 문제에 직면 한 것처럼 보였습니다. 하지만 확인하고 코드가 괜찮아 보이는군요. 누군가가 나를 도울 수 있다면 정말 감사 할 것입니다.Hadoop의 WordCount 프로그램에서 예외 가져 오기

java.io.IOException : 예상되는 org.apache.hadoop.io.Text에서 키의 형식이 일치하지 않습니다. org.apache.hadoop.io.LongWritable at org.apache.hadoop.mapred.MapTask $ MapOutputBuffer.collect (MapTask.java:871)

package com.test.wc; 
import java.io.IOException; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Mapper; 

public class WordCountMapper extends Mapper<LongWritable,Text,Text,IntWritable> { 

public void Map(LongWritable key,Text value,Context ctx) throws IOException , InterruptedException { 
    String line = value.toString(); 
    for(String word:line.split("\\W+")) { 
     if(word.length()> 0){ 
      ctx.write(new Text(word), new IntWritable(1)); 
     } 
    } 
} 
} 


package com.test.wc; 
import java.io.IOException; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Reducer; 
public class WordCountReducer extends Reducer<Text,IntWritable,Text,IntWritable> { 

public void reduce(Text key, Iterable<IntWritable> values, Context ctx) throws IOException,InterruptedException { 
int wordCount = 0; 
    for(IntWritable value:values) 
    { 
     wordCount+=value.get(); 
    } 
    ctx.write(key,new IntWritable(wordCount)); 
} 

} 


package com.test.wc; 
import java.io.IOException; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
public class WordCountJob { 
public static void main(String args[]) throws IOException, InterruptedException, ClassNotFoundException{ 
    if(args.length!=2){ 
     System.out.println("invalid usage"); 
     System.exit(-1); 
    } 

    Job job = new Job(); 
    job.setJarByClass(WordCountJob.class); 
    job.setJobName("WordCountJob"); 



    FileInputFormat.addInputPath(job, new Path(args[0])); 
    FileOutputFormat.setOutputPath(job, new Path(args[1])); 

    job.setMapperClass(WordCountMapper.class); 
    job.setReducerClass(WordCountReducer.class); 

    //job.setCombinerClass(WordCountReducer.class); 

    job.setMapOutputKeyClass(Text.class); 
    job.setMapOutputValueClass(IntWritable.class); 

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


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

} 
} 
+1

'@ Override '주석을 넣으려고 했습니까? 당신의'map()'메쏘드는 대문자'M'을 가지며, 아마도 당신의 버전 대신에 디폴트'map()'이 사용될 것입니다. – Quetzalcoatl

+0

@Quetzalcoatl 주석은 여러분이 겪고있는 문제입니다 - 기본지도 메소드는 신원 기능이며 동일한 입력 키/값 쌍을 출력합니다 -지도 메소드 이름을 소문자로 변경하고 메서드에'@Orride' 주석을 추가하십시오. –

답변

0

귀하의 Map() 방법은 때문에 소문자 m 대신에 자본 M의 사용에 Mappermap() 메소드를 오버라이드 (override) 할 수 없습니다.

이와 같이, 기본 신원 맵 방법이 사용되고 있으며, 입력과 동일한 키와 값 쌍이 출력으로 사용됩니다. 매퍼가 extends Mapper<LongWritable,Text,Text,IntWritable>을 지정했기 때문에 Text, IntWritable 대신에 시도 된 출력이 LongWritable, Text 인 경우 예외가 발생합니다.

map()Map() 방법을 변경하고 @Override 주석이 트릭을 할해야 추가 - 당신은 내가보기 엔이 같은 오류를 방지하기 위해이 방법 오버라이드 기능이 내장 된 것 사용하는 것이 좋습니다 거라고는 IDE를 사용하는 경우.

+0

감사합니다 얘들 아 ..... 그건 어리석은 실수 였어 .... 어쨌든 나는 그것을 잡지 못했다.지도 메소드의 이름을 고친 후에 잘 작동한다. – KBR

0

그냥

공공 무효 지도 (LongWritable 키, 텍스트 값, 상황에 맞는 CTX)

공공 무효 지도 (LongWritable 키에서 매퍼 기능을 편집 , 텍스트 값, 컨텍스트 ctx)

그것은 나를 위해 일하고 있습니다.

하둡 버전 : - Hadoop 1.0.3