2014-01-27 2 views
3

У меня есть свой картер и редукторы следующим образом. Но я получаю странное исключение. Я не могу понять, почему он бросает такое исключение.Ошибка: java.io.IOException: неправильный класс значения: класс org.apache.hadoop.io.Text не является классом Myclass

public static class MyMapper implements Mapper<LongWritable, Text, Text, Info> { 

    @Override 
    public void map(LongWritable key, Text value, 
     OutputCollector<Text, Info> output, Reporter reporter) 
     throws IOException { 
     Text text = new Text("someText") 
      //process 
     output.collect(text, infoObjeject); 
    } 

} 

public static class MyReducer implements Reducer<Text, Info, Text, Text> { 

    @Override 
    public void reduce(Text key, Iterator<Info> values, 
     OutputCollector<Text, Text> output, Reporter reporter) 
     throws IOException { 
     String value = "xyz" //derived in some way 
     //process 
     output.collect(key, new Text(value)); //exception occurs at this line 
    } 

} 

System.out.println("Starting v14 "); 
JobConf conf = new JobConf(RouteBuilderJob.class); 
conf.setJobName("xyz"); 

String jarLocation =ClassUtil.findContainingJar(getClass()); 

System.out.println("path of jar file = " + jarLocation); 

conf.setJarByClass(RouteBuilderJob.class); 

conf.setMapOutputKeyClass(Text.class); 
conf.setMapOutputValueClass(Info.class); 

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

//am i missing something here??? 

conf.setMapperClass(RouteBuilderJob.RouteMapper.class); 
conf.setCombinerClass(RouteBuilderJob.RouteReducer.class); 
conf.setReducerClass(RouteBuilderJob.RouteReducer.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); 

Я получаю исключение:

Error: java.io.IOException: wrong value class: class org.apache.hadoop.io.Text is not class com.xyz.mypackage.Info 
at org.apache.hadoop.mapred.IFile$Writer.append(IFile.java:199) 
at org.apache.hadoop.mapred.Task$CombineOutputCollector.collect(Task.java:1307) 
at com.xyz.mypackage.job.MyJob$RouteReducer.reduce(MyJob.java:156) 
at com.xyz.mypackage.job.MyJob$RouteReducer.reduce(MyJob.java:1) 

Внутренне объект информации (который реализует Writable) сериализуются с использованием Text

@Override 
public void write(DataOutput out) throws IOException { 
    Gson gson = new Gson(); 
    String searlizedStr = gson.toJson(this); 
    Text.writeString(out, searlizedStr); 
} 

@Override 
public void readFields(DataInput in) throws IOException { 
    String s = Text.readString(in); 
    Gson gson = new Gson(); 
    JsonReader jsonReader = new JsonReader(new StringReader(s)); 
    jsonReader.setLenient(true); 

Info info = gson.fromJson(jsonReader, Info.class); 
    //set fields using this.somefield = info.getsomefield() 
} 
+0

Что такое «значение» здесь. Я не нахожу объявления или ничего для переменной «значение»? "output.collect (ключ, новый текст (значение));" в этой строке – Backtrack

+0

@Backtrack значение строка – user93796

+0

@Backtrack вы можете помочь мне с этим? Я потратил много времени на отладку этого – user93796

ответ

7

Технически типами выхода вашего снижение должно быть одинаковым как ваш тип ввода. Это должно быть правдой, если вы используете комбайнер, поскольку выход комбайнера подается в ваш редуктор.

+0

спас мой день @ b4hand –

+0

Шахта тоже :) спасибо! – Leo

+0

Помог мне тоже. Но любая конкретная причина, почему редуктор хочет, чтобы оба типа оставались такими же – Abhi

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

  • Нет связанных вопросов^_^