2014-01-04 1 views
1

У меня есть только работа с картой, в которой берется файл последовательности (клавиша Text, значение BytesWritable) в качестве входных и выходных данных в файл последовательности (ключ NullWritable, значение Text).MapReduce job failed in oozie

Java класс

import java.io.*; 
import java.util.*; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.BytesWritable; 
import org.apache.hadoop.io.NullWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.Mapper; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
import org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat; 

public class Test { 

    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException { 

     Configuration conf = new Configuration(); 
     Job job = new Job(conf, "Test"); 

     job.setJarByClass(Test.class); 
     job.setMapperClass(TestMapper.class); 

     job.setInputFormatClass(SequenceFileInputFormat.class); 
     job.setOutputFormatClass(SequenceFileOutputFormat.class); 

     job.setOutputKeyClass(NullWritable.class); 
     job.setOutputValueClass(Text.class); 

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

     job.setNumReduceTasks(0); 

     FileInputFormat.addInputPath(job, new Path(args[0])); 
     FileOutputFormat.setOutputPath(job, new Path(args[1])); 

     job.submit(); 
    } 

    public static class TestMapper extends Mapper<Text, BytesWritable, NullWritable, Text> { 
     Text outValue = new Text(""); 
     int counter = 0; 
     public void map(Text filename, BytesWritable data, Context context) throws IOException, InterruptedException { 
     /logic 
       } 
    } 
} 

Это работает нормально при выполнении задания из команды Unix, когда та же работа планируется в oozie увидеть ниже ошибки

java.lang.ClassCastException: org.apache.hadoop .io.LongWritable не может быть приведен к org.apache.hadoop.io.Text в проверочном $ TestMapper.map (Test.java:56) конфигурации

работы в oozie

<configuration> 
<property> 
<name>mapred.input.dir</name> 
<value>${input}</value> 
</property> 
<property> 
<name>mapred.output.dir</name> 
<value>/temp</value> 
</property> 
<property> 
<name>mapreduce.map.class</name> 
<value>Test$TestMapper</value> 
</property> 
<property> 
<name>mapred.reduce.tasks</name> 
<value>0</value> 
</property> 
<property> 
<name>mapreduce.job.output.key.class</name> 
<value>org.apache.hadoop.io.NullWritable</value> 
</property> 
<property> 
<name>mapreduce.job.output.value.class</name> 
<value>org.apache.hadoop.io.Text</value> 
</property> 
<property> 
<name>mapreduce.job.inputformat.class</name> 
<value>org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat</value> 
</property> 
<property> 
<name>mapreduce.job.outputformat.class</name> 
<value>org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat</value> 
</property> 
<property> 
<name>mapreduce.job.mapinput.key.class</name> 
<value>org.apache.hadoop.io.Text</value> 
</property> 
<property> 
<name>mapreduce.job.mapinput.value.class</name> 
<value>org.apache.hadoop.io.BytesWritable</value> 
</property> 
<property> 
<name>mapred.reducer.new-api</name> 
<value>true</value> 
</property> 
<property> 
<name>mapred.mapper.new-api</name> 
<value>true</value> 
</property> 

Может кто-нибудь сказать мне, что это ошибка здесь .. спасибо

+0

Возможные повторности из: http://stackoverflow.com/questions/20184297/Ozzie-inputformat-MapReduce-апи. Попробуйте с помощью значения конфигурационного mapred.input.format.class – Simplefish

+0

спасибо за ответ, не работает для меня ... mapred.input.format.class org.apache.hadoop.mapreduce.lib. input.SequenceFileInputFormat user2800129

+0

как насчет mapreduce.inputformat.class? – Simplefish

ответ

1

classcast исключение указывает, что Oozie все еще использует inputformat по умолчанию TextInputFormat, который имеет тип ключа LongWritable. Так как у картографа есть ключевой тип текста, существует несоответствие типа при проглатывании картографом. Таким образом, ключ конфигурации mapreduce.job.inputformat.class был некорректен.

(после некоторых проб и ошибок)

Мы обнаружили, что правильное имя свойства mapreduce.inputformat.class, то есть:

<property> 
    <name>mapreduce.inputformat.class</name> 
    <value>org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat</value> 
</property>