2013-04-14 28 views
0

我在嘗試運行hadoop上的第一個程序時遇到此異常。 (我在版本0.20.2上使用hadoop新API)。我在網上搜索時,它看起來像大多數人在配置邏輯中沒有設置MapperClass和ReducerClass時面臨這個問題。 但我檢查,它看起來代碼是好的。如果有人能幫助我,我會很感激。在Hadoop中獲取WordCount程序中的異常

java.io.IOException的類型匹配:從地圖鍵:預計org.apache.hadoop.io.Text,在org.apache.hadoop.mapred.MapTask $收到org.apache.hadoop.io.LongWritable 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

您是否試圖在@覆蓋註解中使用?你的'map()'方法有一個大寫'M',可能會導致使用默認的'map()'而不是你的版本。 – Quetzalcoatl

+0

@Quetzalcoatl評論是你遇到的問題 - 默認的地圖方法是一個標識函數,並將輸出相同的輸入鍵/值對 - 更改您的地圖方法名稱爲小寫,並添加一個「@ Override」註釋的方法。 –

回答

0

Map()方法不能夠覆蓋Mappermap()方法由於你在地方的小寫m使用一個大寫M的。

因此,正在使用默認的身份映射方法,這會導致用作輸入的相同鍵和值對也被用作輸出。由於您的映射程序指定了extends Mapper<LongWritable,Text,Text,IntWritable>,因此您嘗試輸出LongWritable, Text而不是Text, IntWritable正在引發該異常。

改變你Map()方法map()並添加註釋@Override應該做的伎倆 - 如果你使用我強烈建議使用它內置的方法重寫功能,以避免類似錯誤的IDE。

+0

謝謝大家.....這真是一個愚蠢的錯誤....不知何故,我無法趕上它..現在工作好後,修復地圖方法的名稱 – KBR

0

只需編輯您的映射功能從

公共無效地圖(LongWritable鍵,文本價值,語境CTX)

公共無效地圖(LongWritable關鍵,文本值,上下文ctx)

它爲我工作。

Hadoop版本: - Hadoop 1.0.3

相關問題