2011-12-24 4 views
0

Я бег этого кода, используя oozie рабочего процесс и получить ошибку несоответствия типов:Тип несовпадение значения с карты

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: Type mismatch in value from map: expected org.apache.hadoop.io.LongWritable, recieved org.apache.hadoop.io.Text

Я использую новый-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 at org.apache.hadoop.mapred.MapTask $ MapOutputBuffer.collect (MapTask.java:876) at 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) at org.apache.hadoop.mapred.Child $ 4.run (Child.java:270) at java.security.AccessController.doPrivileged (собственный метод) at 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. Без следующего свойства код выполняет вывод вывода так же, как вход с префиксом смещения!

 <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> 
+0

Опубликованный код выглядит хорошо. Не могли бы вы выслать полный код? –

+1

В общем, не забывайте, что Java-генераторы * не * принудительно применяются во время выполнения, поэтому любой может поместить любой объект на карту по своему усмотрению. в экземпляре Hadoop Text вместо Hadoop LongWritable, вы получите это сообщение. Дополнительный код, полный stacktrace исключения будет helpf ул. –

+0

Согласовано с owlstead. Мне было бы лучше, если первый элемент шаблона Mapper не является «Object». –

ответ

2

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

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 Апи] По какой-то причине, что не мог поймать мои глаза :-(, так как я использовал модифицированную версию без апи рабочий процесс!

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

1

Скорее всего, вы используете редуктор в качестве объединителя, что означает, что он работает в контексте карты. см. аналогичный вопрос здесь Wrong key class: Text is not IntWritable

+2

Редуктор 'LongWritable, LongWritable' ->' LongWritable, LongWritable', а mapper выводит 'LongWritable, LongWritable', поэтому все должно быть хорошо ... –

Смежные вопросы