Программа Hadoop Map Reduce - PullRequest
       39

Программа Hadoop Map Reduce

1 голос
/ 24 марта 2011

Когда я пробовал пример программирования Map Reduce из Hadoop в книге действий на основе API Hadoop 0.20, я получил ошибку

java.io.IOException: несоответствие типа значения карте

Но насколько я проверил, я передаю все правильно. Было бы очень полезно, если бы кто-то мог помочь мне с этим.

Вот код. Это тот же код, который есть в книге.

@SuppressWarnings("unused")
public class CountPatents extends Configured implements Tool {
    @SuppressWarnings("deprecation")

    public static class MapClass extends MapReduceBase implements Mapper<Text, Text, Text, Text> {
        public void map(Text key, Text value,OutputCollector<Text, Text> output,Reporter reporter) throws IOException {
            output.collect(value, key);
        }
    }
public static class Reduce extends MapReduceBase implements Reducer<Text, Text, Text, IntWritable> {
    public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
        int count=0;
        while(values.hasNext()){
            count=count+1;

            values.next();

        }


        output.collect(key, new IntWritable(count));
    }
}


    public int run(String[] args) throws Exception {

    Configuration conf = getConf();
    JobConf job = new JobConf(conf, CountPatents.class);
    Path in = new Path(args[0]);
    Path out = new Path(args[1]);
    FileInputFormat.setInputPaths(job, in);
    FileOutputFormat.setOutputPath(job, out);
    job.setJobName("MyJob");
    job.setMapperClass(MapClass.class);
    job.setReducerClass(Reduce.class);
    job.setInputFormat(KeyValueTextInputFormat.class);
    job.setOutputFormat(TextOutputFormat.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(Text.class);
    job.set("key.value.separator.in.input.line", ",");
    JobClient.runJob(job);
    return 0;
    }
    public static void main(String[] args) throws Exception {
        int res = ToolRunner.run(new Configuration(), new CountPatents(), args);
        System.exit(res);


    }

    }

Ответы [ 5 ]

8 голосов
/ 24 марта 2011

При быстром просмотре (без локального запуска кода) создается впечатление, что вы устанавливаете выходные данные для задания типа Text, когда вы устанавливаете job.setOutputValueClass(Text.class);, но тип вывода на вашем редукторе установлен на IntWritable. Это, вероятно, ошибка.

0 голосов
/ 20 июля 2017

В вашей функции редуктора вы используете OutputCollector, что означает, что класс выходного ключа будет иметь тип Text, а класс выходного значения будет иметь тип IntWritable. Однако в функции main (run) вы установили job.setOutputKeyClass (Text.class); job.setOutputValueClass (Text.class).

Измените job.setOutputValueClass (Text.class) на job.setOutputValueClass (IntWritable.class), и все готово!

Также всегда лучше установить MapperOutputKeyType и MapperOutputValueType, чтобы избежать любых расхождений. Hadoop использует механизм на основе интерфейса Writable вместо собственного механизма сериализации Java. В отличие от механизма сериализации Java, этот метод не инкапсулирует имя класса в сериализованном объекте. Следовательно, явное имя класса требуется для создания экземпляров этих классов из Mapper в Reducer, поскольку невозможно десериализовать байтовые массивы, представляющие доступные для записи экземпляры, без знания десериализации класса в (входной ключ Reducer и экземпляр значения). Эта информация должна быть явно предоставлена ​​путем вызова setMapOutputKeyClass и setMapOutputValueClass в экземпляре задания

0 голосов
/ 05 декабря 2013

Карта испускает <Текст, Текст>

Установлено

job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);

setMapOutputKeyClass setMapOutputValueClass

0 голосов
/ 18 марта 2013

Ошибка должна быть в выходе из редуктора:

Ваше определение класса резюме выглядит следующим образом:

открытый статический класс Reduce extends. MapReduceBase реализует Reducer

поэтому выходное значение должно быть типа IntWritable.

Однако вы упомянули job.setOutputValueClass (Text.class);

Таким образом, в соответствии с конфигурацией, вывод редуктора должен быть Text.

Решение: В конфигурации добавьте следующие строки job.setMapOutputKeyClass (Text.class); job.setMapOutputValueClass (IntWritable.class);

и Изменить: job.setOutputValueClass (IntWritable.class);

Тогда попробуйте запустить

0 голосов
/ 31 мая 2011

Пропущенный вызов:

job.setMapOutputValueClass (IntWritable.class);

Та же проблема с использованием нового интерфейса 0.20 и нового объекта "Job" вместо JobConf.

...