2014-10-26 59 views
0

我使用工作流運行我的MR工作:0.5" 我的用例創建輸出基於密鑰的目錄結構 這是我的配置文件: - 。如何使用hadoop.mapreduce.lib.output.MultipleOutputs使用oozie工作流創建目錄結構? 。

`   
     <configuration> 
       <!-- These are important. --> 
       <property> 
        <name>mapred.mapper.new-api</name> 
        <value>true</value> 
       </property> 
       <property> 
        <name>mapred.reducer.new-api</name> 
        <value>true</value> 
       </property> 
       <property> 
        <name>mapred.job.queue.name</name> 
        <value>${queue.name} 
        </value> 
       </property> 
       <property> 
        <name>mapreduce.map.class</name> 
        <value>com.a.b.c.Amapper</value> 
       </property> 
       <property> 
        <name>mapreduce.reduce.class</name> 
        <value>com.a.b.c.Areducer</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.Text</value> 
       </property> 
       <property> 
        <name>mapreduce.outputformat.class</name> 
        <value>org.apache.hadoop.mapreduce.lib.output.MultipleOutputs 
        </value> 
       </property> 
       <property> 
        <name>mapred.input.dir</name> 
        <value>${inputDir}</value> 
       </property> 
       <property> 
        <name>mapred.output.dir</name> 
        <value>${outputDir}</value> 
       </property> 
      </configuration>` 

在減速,我想創建格式的目錄結構中使用此代碼 -

`public class Areducer extends Reducer<Text, Text, Text, Text> { 
    private Text aggregatorRecord = new Text(); 
    private MultipleOutputs<Text, Text> out; 

    public void setup(Context context) { 
     out = new MultipleOutputs<Text, Text>(context); 
    } 

    public void reduce(Text aggregatorRecordKey, 
      Iterable<Text> values, Context context) 
      throws IOException, InterruptedException { 
     /** 
      some business logic to do aggregation to set aggregatorRecord. 
     */ 
     String plist = "Surname|Forename"; 
     Text t = new Text(plist); 
     out.write(aggregatorRecordKey, aggregatorRecord, generateFileName(t)); 
    } 

    protected void cleanup(Context context) throws IOException, 
      InterruptedException { 
     out.close(); 
    } 

    private String generateFileName(Text k) { 
     String[] kStr = k.toString().split("\\|"); 

     String sName = kStr[0]; 
     String fName = kStr[1]; 

     // example for k = Smith|John 
     // output written to /user/hadoop/path/to/output/Smith/John-r-00000 
     // (etc) 
     return sName + "/" + fName; 
    } 

`

Oozie的工作流程給出了這樣的例外

java.lang.NoSuchMethodException:org.apache.hadoop.mapreduce.lib.output.MultipleOutputs。 < \初始化>()

有人建議可以使用MultipleOutputs使用Oozie的工作流創建目錄結構,正確的做法?

回答

0

您的問題是MultipleOutputs不是OutputFormat,因此您不會將其設置爲作業的輸出格式。我通常使用java類來配置和提交我的MultipleOutputs作業,但看着你的代碼,我認爲你需要將輸出格式類型設置爲TextOutputFormat,並將你的引用保留爲reducer變量。

+0

非常感謝。 它的工作。 最初,我堅持定義 org.apache.hadoop.mapreduce.lib.output.MultipleOutputs,但將其更改爲org.apache.hadoop.mapreduce.lib.output。 TextOutputFormat,解決了我的問題。但我正在逐漸目錄文件結構,這樣的輸出: - /outputDir /姓 /outputDir /姓氏/錄名字-R-00000 /outputDir/_SUCCESS /outputDir /一部分-R-00000, 我想_SUCCESS在Forename-r-00000的'Surname'目錄中(因爲它需要標誌來啓動其他相關作業)。所以,如果不寫java類,是不是可以得到它? – user2449613 2014-10-27 06:54:18

相關問題