hadoop多文件輸出


現實環境中,常常遇到一個問題就是想使用多個Reduce,但是迫於setup和cleanup在每一個Reduce中會調用一次,只能設置一個Reduce,無法是實現負載均衡。

問題,如果要在reduce中輸出兩種文件,一種是標志,另一種是正常業務數據,實現方案有三種:

(1)設置一個reduce,在reduce中將數據封裝到一個集合中,在cleanup中將數據寫入到hdfs中,但是如果數據量巨大,一個reduce無法充分利用資源,實現負載均衡,但是如果數據量較小,可以使用

(2)設置多文件輸出,使用MultipleOutputs類

具體見代碼:

  1. private MultipleOutputs mos;   
  2.   
  3. @Override   
  4. protected void setup(Context context)   
  5. throws IOException, InterruptedException {   
  6.   mos=new MultipleOutputs(context);  
  7. }   
  8. @Override   
  9. protected void reduce(Text key, Iterable<Text> values, Context context)   
  10. throws IOException, InterruptedException {   
  11.   
  12. String key1=key.toString();   
  13. for(Text t:values){   
  14.    if(key1.equals("a")){   
  15.    mos.write("a", key,t);   
  16.    } else if(key1.equals("b")){   
  17.    mos.write("b", key,t);      
  18.    } else if(key1.equals("c")){   
  19.    mos.write("c", key,t);   
  20.      
  21.    }   
  22.  }   
  23. }   
  24. @Override   
  25. protected void cleanup(   
  26. Context context)   
  27. throws IOException, InterruptedException {   
  28. mos.close();  
  29. }   
  1. main方法中配置  
  1. <pre name="code" class="java">MultipleOutputs.addNamedOutput(job, "a", TextOutputFormat.class, Text.class, Text.class);  
  2. MultipleOutputs.addNamedOutput(job, "b", TextOutputFormat.class, Text.class, Text.class);  
  3. MultipleOutputs.addNamedOutput(job, "c", TextOutputFormat.class, Text.class, Text.class);  


  1. 結果文件為  a-r-0000,b-r-0000,c-r-0000,part-r-0000  

(3)第三種方案是自己實現多文件輸出 詳見http://blog.csdn.net/qingmu0803/article/details/39665407


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM