Несовпадение значений по карте - PullRequest
0 голосов
/ 24 декабря 2011

Я запускаю этот код, используя oozie workflow и получаю ошибку несоответствия типов:

 public static class mapClass extends Mapper<Object, Text, LongWritable, LongWritable> {
        public void map(Object, Text, Context..)
..
         context.write(<LongWritable type> , <LongWritable type> )
}

public static class reduceClass extends Reducer<LongWritable, LongWritable,LongWritable, LongWritable> {
        public void reduce(LongWritable, LongWritable, context)
..
    context.write(<LongWritable type>, <LongWritable type>)
{

}

java.io.IOException: несоответствие типов в значении из карты: ожидается org.apache.hadoop.io.LongWritable, получено org.apache.hadoop.io.Text

Я использую new-api в своем рабочем процессе. Тот же код отлично работает без использования oozie.

Любая помощь будет оценена. Благодаря.

----- пример кода ---

package org.apache.hadoop;
import java.io.IOException;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Mapper;


public class MapperLong extends Mapper<LongWritable, Text, LongWritable, LongWritable> {
    public final static int COL_ZERO = 0;
    public final static int COL_ONE = 1;
    public final static int COL_TWO = 2;
    public final static int COL_THREE = 3;

@Override
    public void map(LongWritable offset, Text line, Context context)
throws IOException, InterruptedException {
        String[] parts = (line.toString()).split(" ");

        LongWritable one = new LongWritable(Integer.parseInt(parts[COL_ONE]));
        LongWritable two = new LongWritable(Integer.parseInt(parts[COL_TWO]));
        context.write(one, two);

    }
}




package org.apache.hadoop;

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.mapreduce.Reducer;


public class ReducerLong extends Reducer<LongWritable, LongWritable, LongWritable, LongWritable> {
@Override
    public void reduce(LongWritable colOneKey, Iterable<LongWritable> values,
        Context context) throws IOException, InterruptedException{
        Set<Integer> colTwo = new HashSet<Integer>();

        for (LongWritable val : values) {
            colTwo.add(Integer.valueOf((int)val.get()));
        }
        context.write(colOneKey, new LongWritable(colTwo.size()));
    }
}
}

java.io.IOException: несоответствие типов в значении из карты: ожидается org.apache.hadoop.io.LongWritable, получено org.apache.hadoop.io.Text в org.apache.hadoop.mapred.MapTask $ MapOutputBuffer.collect (MapTask.java:876) в org.apache.hadoop.mapred.MapTask $ NewOutputCollector.write (MapTask.java:574) в org.apache.hadoop.mapreduce.TaskInputOutputContext.write (TaskInputOutputContext.java:80) в org.apache.hadoop.mapreduce.Mapper.map (Mapper.java:124) в org.apache.hadoop.mapreduce.Mapper.run (Mapper.java:144) в org.apache.hadoop.mapred.MapTask.runNewMapper (MapTask.java:647) в org.apache.hadoop.mapred.MapTask.run (MapTask.java:323) в org.apache.hadoop.mapred.Child $ 4.run (Child.java:270) at java.security.AccessController.doPrivileged (собственный метод) в javax.security.auth.Subject.doAs (Subject.java:396) в org.apache.hadoop.security.UserGroupInformation.doAs (UserGroupInformation.java:1127) в org.apache.hadoop.mapred.Child.main (Child.java:264)

Input :
34 342 1 1
45 23 0 1
..
..

Примечание: я изменил тип объекта на LongWritable, что не имело никакого значения. Вышеуказанное исключение выдается при использовании следующего свойства в workflow.xml. Без следующего свойства код выполняет вывод, аналогичный вводу с префиксом offset!

        <property>
            <name>mapred.output.key.class</name>
            <value>org.apache.hadoop.io.LongWritable</value>
        </property>
        <property>
            <name>mapred.output.value.class</name>
            <value>org.apache.hadoop.io.LongWritable</value>
        </property>

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

Хорошо, я разобрался. Проблема была в рабочем процессе, который я определил.

I had 
<name>mapreduce.mapper.class</name>
and 
<name>mapreduce.reducer.class</name>

instead of
<name>mapreduce.map.class</name>
and 
<name>mapreduce.reduce.class</name>

[см. https://github.com/yahoo/oozie/wiki/Oozie-WF-use-cases MR Api] По какой-то причине это не могло не броситься в глаза :-(, поскольку я использовал модифицированную версию рабочего процесса без API!

Спасибо всем за ваше время.

1 голос
/ 24 декабря 2011

Скорее всего, вы используете редуктор в качестве объединителя, что означает, что он работает в контексте карты. см. аналогичный вопрос здесь Неправильный ключ: текст не IntWritable

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...