Ошибка: 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() 
}

person user93796    schedule 27.01.2014    source источник
comment
при чем тут ценность. Я не нахожу объявления или чего-либо для переменной значения? output.collect(ключ, новый текст(значение)); в этой строке   -  person backtrack    schedule 27.01.2014
comment
Значение @Backtrack — это строка   -  person user93796    schedule 27.01.2014
comment
@Backtrack, не могли бы вы помочь мне с этим? Я потратил много времени на отладку этого   -  person user93796    schedule 27.01.2014
comment
Я уверен .. Я изучаю это   -  person backtrack    schedule 27.01.2014
comment
@Backtrack Спасибо за помощь. Я здесь только, дайте мне знать, если вам нужны какие-либо материалы с моей стороны.   -  person user93796    schedule 27.01.2014
comment
Текстовое значение = новый текст (xyz); попробуйте этот и дайте мне знать. Измените тип со строки на ТЕКСТ   -  person backtrack    schedule 27.01.2014
comment
Мой редуктор K2, V2 имеет тип Text. Также я установил outputkeyClass для outputvalueclass в text. Итак, почему это так жалуется? Обязательна ли настройка объединителя?   -  person user93796    schedule 27.01.2014
comment
давайте продолжим это обсуждение в чате   -  person user93796    schedule 27.01.2014
comment
Нет . Комбайнер не нужен. Да, я посмотрел код, все в порядке. Просто попробуйте 1. Измените тип ЗНАЧЕНИЕ на ТЕКСТ и 2. удалите комбинатор, если он вам не нужен.   -  person backtrack    schedule 27.01.2014
comment
Проблема решилась после удаления комбайна. @Backtrack спасибо назад   -  person user93796    schedule 27.01.2014


Ответы (1)


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

person b4hand    schedule 04.05.2014
comment
Мне тоже помогло. Но любая конкретная причина, по которой редуктор хочет, чтобы оба типа оставались одинаковыми - person Abhi; 19.02.2016