Странная ошибка в классе mapreduce

эта ошибка кажется тривиальной, но она не исчезнет. У меня определен следующий класс:

import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapred.TextInputFormat;
import org.apache.hadoop.mapred.TextOutputFormat;
import org.apache.hadoop.mapreduce.Mapper;

public class Anagram_Mapper extends Mapper<LongWritable, Text, Text, Text> {

в «основной» функции я пытаюсь использовать JobConf для запуска простого mapreduce:

public static void main(String args[]){
     JobConf conf = new JobConf(Anagram_Mapper.class);
       conf.setJobName("anagram_mapper");

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

       conf.setMapperClass(Anagram_Mapper.class);
       conf.setCombinerClass(Reduce.class);
       conf.setReducerClass(Reduce.class);

       conf.setInputFormat(TextInputFormat.class);
       conf.setOutputFormat(TextOutputFormat.class);

       FileInputFormat.setInputPaths(conf, new Path(args[0]));
       FileOutputFormat.setOutputPath(conf, new Path(args[1]));

       try {
        JobClient.runJob(conf);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Eclipse выдает ошибку в этой строке:

conf.setMapperClass(Anagram_Mapper.class);

ошибка:

The method setMapperClass(Class<? extends Mapper>) in the type JobConf 
is not applicable for the arguments (Class<Anagram_Mapper>)

но, как вы можете видеть выше, мой класс Anagram_Mapper расширяет Mapper, верно? так что я не понимаю, почему эта ошибка....

РЕДАКТИРОВАТЬ: кто-то написал здесь, а затем отозвал свой пост, но это помогло мне направить меня в правильном направлении. видимо я использую: org.apache.hadoop.mapreduce.Mapper

но JobConf.setMapperClass принимает только: org.apache.hadoop.mapred.Mapper

теперь я немного запутался в разнице, они кажутся в основном одинаковыми, и API говорит мне, что они оба действительны в Hadoop 2.2.0, версии, которую я использую....


person pedron    schedule 19.08.2014    source источник


Ответы (2)


Действительно, вы смешиваете старый mapred API с новым mapreduce API.

По сути, Hadoop mapreduce поддерживает два несовместимых API, и вам нужно решить, какой из них использовать. Я могу сбить с толку, потому что они разделяют классы с одинаковыми или похожими именами. Вы должны внимательно посмотреть на свои операторы импорта.

Оба API могут достичь почти одного и того же. mapred не объявлен устаревшим и не удален, чтобы не нарушать устаревшие приложения. mapreduce — это тот же API, но с немного улучшенным дизайном.

Если вы начинаете новый проект, я бы посоветовал использовать новый. Но это не имеет большого значения. Простое решение — изменить оператор импорта org.apache.hadoop.mapreduce.Mapper.

person Clément MATHIEU    schedule 19.08.2014
comment
Вот оно. Чего я не заметил, так это того, что Mapper — это класс в 1.0, но интерфейс в 2.0. что меня бросило, так это автозаполнение в Eclipse, оно не предлагало версию «mapred», потому что у меня были «расширения» (которые были автоматически заполнены как таковые Eclipse). Теперь я все исправил, и часть Mapper работает, спасибо - person pedron; 20.08.2014
comment
Исправление к приведенному выше утверждению: org.apache.hadoop.mapred — это интерфейс версии 1.0. org.apache.hadoop.mapreduce — это класс и версия 2.0. - person pedron; 21.08.2014

Столкнулся с той же ошибкой после написания класса Driver, ниже ошибка Метод setReducerClass(Class) в типе Job неприменим для аргументов (Class)

причина получения этой ошибки: после создания класса редуктора я сразу же передал имя класса в setReducerClass(); без определения класса редуктора. Функция ожидает имя класса, которое фактически расширяет Reducer, она будет выдавать ту же ошибку до тех пор, пока переданный аргумент не будет соответствовать ожидаемому типу аргумента метода.

person Sandeep bhalla    schedule 30.11.2015