hadoop 一個Job多個MAP與REDUCE的執行

hadoop 中一個Job中可以按順序運行多個mapper對數據進行前期的處理,再進行reduce,經reduce後的結果可經個經多個按順序執行的mapper進行後期的處理,這樣的Job是不會保存中間結果的,並大大減少了I/O操作。

例如:在一個Job中,按順序執行 MAP1->MAP2->REDUCE->MAP3->MAP4 在這種鏈式結構中,要將MAP2與REDUCE看成這個MAPREDUCE的核心部分(就像是單箇中的MAP與REDUCE),並且partitioning與shuffling在此處纔會被應用到。所以MAP1作爲前期處理,而MAP3與MAP4作爲後期處理。

 

[java] view plaincopy
  1. Configuration conf = getConf();  
  2. JobConf job = new JobConf(conf);  
  3.   
  4.   
  5. job.setJobName(“ChainJob”);  
  6. job.setInputFormat(TextInputFormat.class);  
  7. job.setOutputFormat(TextOutputFormat.class);  
  8.   
  9.   
  10. FileInputFormat.setInputPaths(job, in);  
  11. FileOutputFormat.setOutputPath(job, out);  
  12.   
  13.   
  14. JobConf map1Conf = new JobConf(false);  
  15.   
  16. ChainMapper.addMapp(job,  
  17.                     Map1.class,  
  18.                     LongWritable.class,   
  19.                     Text.class,  
  20.                     Text.class,  
  21.                     Text.class,  
  22.                     true,  
  23.                     map1Conf);  
  24.   
  25. //將map1加入到Job中  
  26.   
  27.   
  28. JobConf map2Conf = new JobConf(false);  
  29. ChainMapper.addMapper(job,  
  30.                       BMap.class,  
  31.                       Text.class,  
  32.                       Text.class,   
  33.                       LongWritable.class,  
  34.                       Text.class,  
  35.                       true,  
  36.                       map2Conf);  
  37.   
  38. /將map2加入到Job中  
  39.   
  40.   
  41.    
  42.   
  43.   
  44. JobConf reduceConf = new JobConf(false);  
  45. ChainReducer.setReducer(job,  
  46.                         Reduce.class,  
  47.                         LongWritable.class,  
  48.                         Text.class,  
  49.                         Text.class,  
  50.                         Text.class,  
  51.                         true,  
  52.                         reduceConf);  
  53.   
  54. /將reduce加入到Job中  
  55.   
  56.   
  57.    
  58.   
  59.   
  60. JobConf map3Conf = new JobConf(false);  
  61. ChainReducer.addMapper(job,  
  62.                        Map3.class,  
  63.                        Text.class,  
  64.                        Text.class,  
  65.                        LongWritable.class,   
  66.                        Text.class,  
  67.                        true,  
  68.                        map3Conf);  
  69.   
  70. /將map3加入到Job中  
  71.   
  72.   
  73.   
  74. JobConf map4Conf = new JobConf(false);  
  75. ChainReducer.addMapper(job,  
  76.                        Map4.class,  
  77.                        LongWritable.class,  
  78.                        Text.class,   
  79.                        LongWritable.class,  
  80.                        Text.class,  
  81.                        true,  
  82.                        map4Conf);  
  83.   
  84. //將map4加入到Job中  
  85.   
  86. JobClient.runJob(job);  
  87.   
  88. 注:上一個的輸出是一下的輸入,所以上一個的輸出數據類型必須與下一個輸入的數據類型一樣  
  89.   
  90.    

***************************************************

addMapper中的參數

public static <K1,V1,K2,V2> void
addMapper(JobConf job,
                    Class<? extends Mapper<K1,V1,K2,V2>> klass,
                    Class<? extends K1> inputKeyClass,
                    Class<? extends V1> inputValueClass,
                    Class<? extends K2> outputKeyClass,
                    Class<? extends V2> outputValueClass,
                    boolean byValue,
                    JobConf mapperConf)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章