2012-06-08 37 views
2

我正在運行mapreduce程序,但我意識到雖然我編寫了reduce函數,但mapreduce並不能優於它。然後我嘗試添加@Override,錯誤表示reduce函數不覆蓋任何超級方法。hadoop減少函數不被執行?

作業配置信息如下

 preProcess.setJobName("GeneProcessing program for 100 SNP"); 

     preProcess.setMapperClass(PreprocessMapper.class); 
     preProcess.setReducerClass(PreprocessReducer.class); 

     preProcess.setInputFormatClass(TextInputFormat.class); 
     //setInputFormat(TextInputFormat.class); 
    preProcess.setOutputFormatClass(TextOutputFormat.class); 


    preProcess.setMapOutputKeyClass(Text.class); 
    preProcess.setMapOutputValueClass(Text.class); 

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

    //preProcess.setNumMapTasks(4); 
    preProcess.setNumReduceTasks(4); 
    FileInputFormat.setInputPaths(preProcess, preprocessInputPath); 
    FileOutputFormat.setOutputPath(preProcess, preprocessOutputPath); 
    //JobClient.runJob(preProcess); 
     preProcess.waitForCompletion(true); 

減少代碼如下

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


import org.apache.hadoop.io.*; 
import org.apache.hadoop.mapreduce.Reducer; 
    public class PreprocessReducer extends Reducer<Text, Text, NullWritable, Text> 
    { 
     public Text newKey = new Text(""); 

      //no enter the reduce task 
      @Override 
     protected void reduce(Text key, Iterator<Text> values, Context output)     
      throws IOException, InterruptedException     
      { 

      do something here 

     } 

    } 

回答

3

您的簽名爲減少方法是錯誤的 - 第二個參數應該是Iterable<Text>而非Iterator<Text>

@Override 
protected void reduce(Text arg0, Iterable<Text> arg1, 
     Context arg2) 
     throws IOException, InterruptedException { 

} 

你在用什麼IDE ? Eclipse有一個Source - > Override/Implement方法菜單選項,這使得簽名更加容易。我相信Netbeans具有類似的功能。

+0

我在mac中使用netbean,以前使用mapred包的代碼,我想更改爲mapreduce包,但奇怪的是,netbean並沒有給我更正。 – user974270

+0

@Chris White,我面臨同樣的問題,我使用Iterable作爲第二個參數,但仍然沒有調用reduce函數。請檢查我的程序[這裏](http://pastebin.com/vy7upAdJ) –