2017-04-15 72 views
1

目標MapReduce的 - 從輸入多路輸出和陣列

我想由picture描述從一個輸入文件和一個陣列具有多個輸出文件。

我的想法

我想過有一個名爲「check」爲Program父類的靜態屬性。

public class Program 
{ 
    //Attribute check 
    private static String check = null; 

    public static class ProgramMapper extends Reducer<Object, Text, Text, Text>{ 
    // mapping 
    } 
    public static class ProgramReducer extends Reducer<Object, Text, Text, TextArray>{ 
    // reducing 
    } 

    public static void main(String[] args){ 
    // main program 
    } 
// ... 

main方法,我會分配check對 「一」, 「B」, 「C」 在一個循環:

public static void main(String[] args) throws Exception{ 

    // Array of checkpoints 
     String[] arr = {"a", "c", "f"}; 

    // Loop for assigning check 
     for(int j = 0; j<arr.length ; j++){ 
      check = arr[j]; 

     // job configuration 
      Configuration conf = new Configuration(); 
      String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); 
      Job job = new Job(conf, "Program"); 
      //... 
      for (int i = 0; i < otherArgs.length - 1; ++i){ 
        FileInputFormat.addInputPath(job, new Path(otherArgs[i])); 
      } 

     /* here I define multiple outputs */ 
      FileOutputFormat.setOutputPath(job,new Path(otherArgs[otherArgs.length - 1]+j)); 
      job.waitForCompletion(true); 
      if (j == arr.length -1){ 
      System.exit(job.waitForCompletion(true) ? 0 : 1); 
     } 

reducer將檢查如果鍵是等於檢查

public static class ProgramReducer extends Reducer<Object, Text, Text, TextArray>{ 

    public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { 

     ArrayList<Text> result = new ArrayList<Text>(); 
     String key1 = key.toString(); 

    // check if the key is equal to check 
     if (key1.equals(check)){ 
      result.add(new Text("o")); 
     }else{ 
      result.add(new Text("x")); 
     } 

    // other reducing code 
    } 
} 

問題

check永遠不會分配給「a」,「b」,「c」,所以我有3個輸出文件全部未選中。

我該如何解決這個問題?

回答

1

main方法在客戶端上運行,但映射器和縮減器在Hadoop節點上運行。要將參數傳遞給您的mapreduce作業,您可以使用Configuration對象。

在你main方法設定值:

conf.set("check", check); 

而且在減少獲得它:

check = context.getConfiguration().get("check"); 

您可以使用方法Reducer.setup來處理數據之前只有一次設置這個值。

+0

謝謝!有效! – EyTea