Введите несоответствие в ключе из карты: ожидается org.apache.hadoop.io.IntWritable, получено org.apache.hadoop.io.LongWritable - PullRequest
0 голосов
/ 13 июня 2018

Я проверил это, и я не могу понять, почему возникла эта ошибка.

Mapper

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

public void map(LongWritable key, Text value, Context context ) throws IOException,InterruptedException {

    String token[]= value.toString().trim().split("::");

    int movieID=Integer.parseInt(token[0].trim());

    context.write(new IntWritable(movieID), new Text(token[1].trim()));

}

}

Редуктор

public class joinReducer extends Reducer<IntWritable, Text, Text, Text> {

public void reduce(IntWritable key, Iterable<Text> values, Context context) throws IOException,InterruptedException {
    float avgRating=0.0f;
    int tokenCount = 0;
    float ratingSum=0.0f;
    int count=0;

    String movieName="";

    for(Text val:values) {
        tokenCount+=1;
    }

    //If we have more than 40 views/ratings
    if(tokenCount-1>40) {

        for(Text val:values) {

            String temp = val.toString();


            if(val.equals("1")||val.equals("2")||val.equals("3")||val.equals("4")||val.equals("5")) {

                float tempRating= Float.parseFloat(val.toString().trim());
                ratingSum += tempRating;
                count++;


            }

            else {

                movieName=val.toString().trim();
            }

        }

        avgRating = ratingSum/ (float)count;

        context.write(new Text(Float.toString(avgRating)), new Text(movieName));
    }

}

}

Драйверконфигурация

Configuration conf= new Configuration();
    String parameter[]= new GenericOptionsParser(conf,args).getRemainingArgs();

    if(parameter.length!=3) {

        System.err.println("Three arguments needed  <File1> <File2> <Out>");
        System.exit(2);
    }


    //set Driver class

    Job job1 = Job.getInstance(conf, "Join");
    job1.setJarByClass(MyDriver.class);
    job1.setReducerClass(joinReducer.class);

    MultipleInputs.addInputPath(job1,  new Path(parameter[0]), TextInputFormat.class, movieMapper.class);
    MultipleInputs.addInputPath(job1,  new Path(parameter[1]), TextInputFormat.class, ratingMapper.class);

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


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


    FileOutputFormat.setOutputPath(job1, new Path(parameter[2] + "/temp"));

    job1.waitForCompletion(true);

18/06/13 09:47:20 INFO mapreduce.Job: задание job_1528823320386_0018 работает в режиме убер: false 18/06/13 09:47:20 INFO mapreduce.Job: карта 0% уменьшить 0% 18/06/13 09:47:24 ИНФОРМАЦИЯ mapreduce.Job: идентификатор задачи: try_1528823320386_0018_m_000000_0, статус: СБОЙ Ошибка: java.io.IOException: несоответствие типов в ключе из карты: ожидается org.apache.hadoop.io.IntWritable, получено org.apache.hadoop.io.LongWritable в org.apache.hadoop.mapred.MapTask $ MapOutputBuffer.collect (MapTask.java:1069) в org.apache.hadoop.mapred.MapTask $ Neworut.запись (MapTask.java:712) в org.apache.hadoop.mapreduce.task.TaskInputOutputContextImpl.write (TaskInputOutputContextImpl.java:89) в org.apache.hadoop.mapreduce.lib.map.WrappedwapperJava: 112) в org.apache.hadoop.mapreduce.Mapper.map (Mapper.java:124) в org.apache.hadoop.mapreduce.Mapper.run (Mapper.java:145) в org.apache.hadoop.mapreduce.lib.input.DelegatingMapper.run (DelegatingMapper.java:55) в организации.apache.hadoop.mapred.MapTask.runNewMapper (MapTask.java:784) в org.apache.hadoop.mapred.MapTask.run (MapTask.java:341) в org.apache.hadoop.mapred.YarnChild $ 2.run (YarnChild.java:168) в java.security.AccessController.doPrivileged (собственный метод) в javax.security.auth.Subject.doAs (Subject.java:422) в org.apache.hadoop.security.UserGroupInformation.doAs (UserGroupInformation.Java: 1642) at org.apache.hadoop.mapred.YarnChild.main (YarnChild.java:163)

18/06/13 09:47:25 ИНФОРМАЦИЯ mapreduce.Job: карта 50% уменьшить 0%18/06/13 09:47:29 ИНФОРМАЦИЯ mapreduce.Job: идентификатор задачи: try_1528823320386_0018_m_000000_1, статус: СБОЙ Ошибка: java.io.IOException: несоответствие типов в ключе из карты: ожидается org.apache.hadoop.io.IntWritable, полученоorg.apache.hadoop.io.LongWritable at org.apache.hadoop.mapred.MapTask $ MapOutputBuffer.collect (MapTask.java:1069) at or.apache.hadoop.mapred.MapTask.apache.hadoop.mapreduce.lib.map.WrappedMapper $ Context.write (WrappedMapper.java:112) в org.apache.hadoop.mapreduce.Mapper.map (Mapper.java:124) в org.apache.hadoop.mapreduce.Mapper.run (Mapper.java:145) в org.apache.hadoop.mapreduce.lib.input.DelegatingMapper.run (DelegatingMapper.java:55) в org.apache.hadoop.mapred.MapTask.runNewMapper (MapTask.java: 784) в org.apache.hadoop.mapred.MapTask.run (MapTask.java:341) в org.apache.hadoop.mapred.YarnChild $ 2.run (YarnChild.java:168) в java.security.AccessController.doPrivileged(Собственный метод) в javax.security.auth.Subject.doAs (Subject.java:422) в org.apache.hadoop.security.UserGroupInformation.doAs (UserGroupInformation.java:1642) в org.apache.hadoop.mapred.YarnChild.main (YarnChild.java:163)

1 Ответ

0 голосов
/ 13 июня 2018

В этом задании работают два сопоставителя: movieMapper и ratingMapper.У RatingMapper в объявлении функции было неправильно написано ключевое слово, а название функции map «map» было ошибочно написано как «Reduce».

Редуктор, согласно нашей конфигурации, должен был принимать ключ типа IntWritable, но получал LongWritable, поэтому произошла ошибка.(TextInputFormat генерирует ключ типа LongWritable и значение типа Text)

...