2014-10-12 48 views
0

我有一個MR程序可以在一堆SequenceFile上完美運行,輸出如預期。 當我嘗試通過Oozie WorkFlow實現相同目的時,InputFormat類屬性無法識別,我感覺輸入僅被視爲默認TextInputFormat。SequenceFile輸入格式在Oozie workflow.xml中無法識別?

下面是如何聲明映射器。 SequenceFile鍵是LongWritable,值是Text。

public static class FeederCounterMapper extends Mapper<LongWritable, Text, Text, IntWritable>{ 

    // setup map function for stripping the feeder for a zone from the input 
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{ 

     final int count = 1;    

     // convert input rec to string   
     String inRec = value.toString(); 

     System.out.println("Feeder:" + inRec); 

     // strip out the feeder from record 
     String feeder = inRec.substring(3, 7);   

     // write the key+value as map output 
     context.write(new Text(feeder), new IntWritable(count)); 
    } 
} 

工作流佈局爲我的應用是如下

/{$namenode}/workflow.xml 
/{$namenode}/lib/FeederCounterDriver.jar 

下面是我的workflow.xml。 $ namenode,$ jobtracker,$ outputdir,$ inputdir在job.properties文件中定義。

<map-reduce> 
    <job-tracker>${jobTracker}</job-tracker> 
    <name-node>${nameNode}</name-node> 
    <prepare> 
    <delete path="${nameNode}/${outputDir}"/> 
    </prepare> 
    <configuration> 
    <property> 
     <name>mapred.reducer.new-api</name> 
     <value>true</value> 
    </property> 
    <property> 
     <name>mapred.mapper.new-api</name> 
     <value>true</value> 
    </property> 
    <property> 
     <name>mapreduce.job.queue.name</name> 
     <value>${queueName}</value> 
    </property> 
    <property> 
     <name>mapred.input.dir</name> 
     <value>/flume/events/sincal*</value> 
    </property> 
    <property> 
     <name>mapred.output.dir</name> 
     <value>${outputDir}</value> 
    </property> 
    <property> 
     <name>mapred.input.format.class</name> 
     <value>org.apache.hadoop.mapred.SequenceFileInputFormat</value> 
    </property> 
    <property> 
     <name>mapred.output.format.class</name> 
     <value>org.apache.hadoop.mapred.TextOutputFormat</value> 
    </property> 
    <property> 
     <name>mapred.input.key.class</name> 
     <value>org.apache.hadoop.io.LongWritable</value> 
    </property> 
    <property> 
     <name>mapred.input.value.class</name> 
     <value>org.apache.hadoop.io.Text</value> 
    </property> 
    <property> 
     <name>mapred.output.key.class</name> 
     <value>org.apache.hadoop.io.Text</value> 
    </property> 
    <property> 
     <name>mapred.output.value.class</name> 
     <value>org.apache.hadoop.io.IntWritable</value> 
    </property> 
    <property> 
     <name>mapreduce.map.class</name> 
     <value>org.poc.hadoop121.gissincal.FeederCounterDriver$FeederCounterMapper</value> 
    </property> 
    <property> 
     <name>mapreduce.reduce.class</name> 
     <value>org.poc.hadoop121.gissincal.FeederCounterDriver$FeederCounterReducer</value> 
    </property> 
    <property> 
     <name>mapreduce.map.tasks</name> 
     <value>1</value> 
    </property>     
</configuration> 
</map-reduce> 

粗壯的一個片段(第一2行)當我運行MR作業是

Feeder:00107371PA1700TEET67576  LKHS 5666LH 2.....   
Feeder:00107231PA1300TXDS 8731TX 1FSHS 8731FH 1.....    

的輸出(第一3行)當我運行使用Ooozie工作流程是

的片斷
Feeder:SEQ!org.apache.hadoop.io.LongWritableorg.apache.hadoop.io.Text�������b'b��X�... 
Feeder:��00105271PA1000FSHS 2255FH 1TXDS 2255TX 1..... 
Feeder:��00103171PA1800LKHS 3192LH 2LKHS 2335LH 1..... 

從Oozie工作流的上述輸出中,我高度懷疑在workflow.xml中提到的輸入格式SequenceFileInputFormat甚至被考慮過,否則我覺得這被覆蓋。

對此的任何輸入都會有所幫助。謝謝

回答

0

在作業跟蹤器中查找爲此mapreduce作業創建的job.xml,並查看在那裏設置的輸入格式類是什麼。這將確認它是否與輸入格式有關。

0

我有一個非常類似的問題,我得到了Oozie的設置我的財產這樣

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

那麼一個點,從屬性名稱中刪除使用正確的輸入格式(檢查您的版本)和班也改變了。

+0

我運行Hadoop 1.2.1並且您提供的解決方案是針對Hadoop 2.x的?我對嗎 ?謝謝。 – shiva 2015-02-11 02:38:35

+0

對不起,延遲時間也是1.2.x。 – jfno 2015-03-11 19:08:49