2013-09-25 42 views
1

我正在使用Hadoop 0.20,我想要兩個減少輸出文件而不是一個輸出。我知道MultipleOutputFormat在Hadoop 0.20中不起作用。我在Eclipse的項目構建路徑中添加了hadoop1.1.1-core jar文件。但它仍然顯示最後一個錯誤。如何在Hadoop 0.20中使用MultipleoutputFormai?

這裏是我的代碼:

public static class ReduceStage extends Reducer<IntWritable, BitSetWritable, IntWritable, Text> 
{ 
    private MultipleOutputs mos; 
    public ReduceStage() { 
     System.out.println("ReduceStage"); 
    } 

    public void setup(Context context) { 
     mos = new MultipleOutputs(context); 
    } 

    public void reduce(final IntWritable key, final Iterable<BitSetWritable> values, Context output) throws IOException, InterruptedException 
    { 
     mos.write("text1", key, new Text("Hello")); 
    } 

    public void cleanup(Context context) throws IOException { 
     try { 
      mos.close(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

而且在run():

FileOutputFormat.setOutputPath(job, ConnectedComponents_Nodes); 
job.setOutputKeyClass(MultipleTextOutputFormat.class); 
MultipleOutputs.addNamedOutput(job, "text1", TextOutputFormat.class, 
       IntWritable.class, Text.class); 

的錯誤是:

java.lang.NoSuchMethodError: org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.setOutputName(Lorg/apache/hadoop/mapreduce/JobContext;Ljava/lang/String;)V 
at org.apache.hadoop.mapreduce.lib.output.MultipleOutputs.getRecordWriter(MultipleOutputs.java:409) 
at org.apache.hadoop.mapreduce.lib.output.MultipleOutputs.write(MultipleOutputs.java:370) 
at org.apache.hadoop.mapreduce.lib.output.MultipleOutputs.write(MultipleOutputs.java:348) 
at bitsetmr$ReduceStage.reduce(bitsetmr.java:179) 
at bitsetmr$ReduceStage.reduce(bitsetmr.java:1) 
at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:176) 
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:566) 
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:408) 
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:216) 

我能做些什麼有MultipleOutputFormat?我是否正確使用了代碼?

+0

建築與1.1.1但運行在0.20不起作用。實際上,0.20會先加載,1.1.1不能覆蓋0.20。 – zsxwing

+0

@zsxwing:那麼如何在hadoop 0.20中使用multipleoutputformat? –

+0

您需要將這些代碼複製到您的項目中,或升級您的hadoop。 – zsxwing

回答

0

您可以去MultipleTextOutputFormat的重寫擴展名,然後使記錄的所有內容成爲'value'的一部分,同時使文件名或路徑成爲關鍵字。

有一個oddjob庫。他們有一系列的輸出格式實現。你想要的那個是MultipleLeafValueOutputFormat:寫入由密鑰指定的文件,並且只寫入該值。

現在,假設你要編寫以下對和你分離是說,製表符(「\ t」): <「KEY1」,「值1」>(您想這是寫在文件名1) < 「KEY2」, 「值2」>(您想這個在文件名2被寫)

所以,現在從減速機輸出將變成如下: < 「文件名1」, 「KEY1 \ tvalue1」> <「 filename2「,」key2 \ tvalue2「>

此外,不要忘記,上面定義的類應該添加爲在outformat類工作:

conf.setOutputFormat(MultipleLeafValueOutputFormat.class); 

這裏有一點要注意的是,你需要用舊mapred包,而不是mapreduce包工作。但這應該不成問題。

+0

@Anar我想有兩個分離文件。 –

+0

是的,這會給你兩個單獨的文件,'filename1'和'filename2'! – Amar

0

首先,您應該確保FileOutputFormat.setOutputName在版本0.20和1.1.1之間具有相同的代碼。如果沒有,你必須有兼容版本來編譯你的代碼。如果相同,你的命令中必須有一些參數錯誤。

我遇到了同樣的問題,我從運行命令中刪除了-Dmapreduce.user.classpath.first=true,它起作用。希望有所幫助!

相關問題