2013-04-14 5 views
0

Я столкнулся с этим исключением при попытке запустить первую программу на hadoop. (Я использую новый API API для версии 0.20.2). Я искал в Интернете, похоже, что большинство людей столкнулись с этой проблемой, когда они не устанавливали MapperClass и ReducerClass в логике конфигурации. Но я проверил, и код выглядит нормально. Я буду очень признателен, если кто-то сможет мне помочь.Получение исключения в программе WordCount в Hadoop

java.io.IOException: Тип несовпадение ключа от карты: ожидается org.apache.hadoop.io.Text, получил org.apache.hadoop.io.LongWritable в 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 - проблема, с которой вы столкнулись - метод карты по умолчанию - это функция идентификации и выводит те же пары входных ключей/значений - измените имя метода карты на нижний регистр и добавьте аннотацию '@ Override' к методу. –

ответ

0

вашего Map() метод не может переопределить метод map()Mapper «s, связанные с использованием заглавных м вместо строчных м.

Таким образом используется метод идентификационной карты по умолчанию, в результате которого используется одна и та же пара ключей и значений, используемых в качестве входных данных, также используемых в качестве вывода. Исключение составляет ваш обработчик с указанным 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

Смежные вопросы