MapReduce框架Mapper和Reducer類原始碼分析

Thinkgamer_gyt發表於2015-08-07

一:Mapper類

在Hadoop的mapper類中,有4個主要的函式,分別是:setup,cleanup,map,run。程式碼如下:

  1. protected void setup(Context context) throws IOException, InterruptedException {
  2. // NOTHING
  3. }

  4. protected void map(KEYIN key, VALUEIN value,
  5.                      Context context) throws IOException, InterruptedException {
  6. context.write((KEYOUT) key, (VALUEOUT) value);
  7. }

  8. protected void cleanup(Context context) throws IOException, InterruptedException {
  9. // NOTHING
  10. }

  11. public void run(Context context) throws IOException, InterruptedException {
  12.     setup(context);
  13.     while (context.nextKeyValue()) {
  14.       map(context.getCurrentKey(), context.getCurrentValue(), context);
  15.     }
  16.     cleanup(context);
  17.   }
  18. }
由上面的程式碼,我們可以瞭解到,當呼叫到map時,通常會先執行一個setup函式,最後會執行一個cleanup函式。而預設情況下,這兩個函式的內容都是nothing。因此,當map方法不符合應用要求時,可以試著通過增加setup和cleanup的內容來滿足應用的需求。

二:Reducer類

在Hadoop的reducer類中,有3個主要的函式,分別是:setup,clearup,reduce。程式碼如下:
  1.   /**
  2.    * Called once at the start of the task.
  3.    */
  4.   protected void setup(Context context
  5.                        ) throws IOException, InterruptedException {
  6.     // NOTHING
  7.   }


  1.   /**
  2.    * This method is called once for each key. Most applications will define
  3.    * their reduce class by overriding this method. The default implementation
  4.    * is an identity function.
  5.    */
  6.   @SuppressWarnings("unchecked")
  7.   protected void reduce(KEYIN key, Iterable<VALUEIN> values, Context context
  8.                         ) throws IOException, InterruptedException {
  9.     for(VALUEIN value: values) {
  10.       context.write((KEYOUT) key, (VALUEOUT) value);
  11.     }
  12.   }


  1.   /**
  2.    * Called once at the end of the task.
  3.    */
  4.   protected void cleanup(Context context
  5.                          ) throws IOException, InterruptedException {
  6.     // NOTHING
  7.   }


在使用者的應用程式中呼叫到reducer時,會直接呼叫reducer裡面的run函式,其程式碼如下:
  1. /*
  2.    * control how the reduce task works.
  3.    */
  4.   @SuppressWarnings("unchecked")
  5.   public void run(Context context) throws IOException, InterruptedException {
  6.     setup(context);
  7.     while (context.nextKey()) {
  8.       reduce(context.getCurrentKey(), context.getValues(), context);
  9.       // If a back up store is used, reset it
  10.       ((ReduceContext.ValueIterator)
  11.           (context.getValues().iterator())).resetBackupStore();
  12.     }
  13.     cleanup(context);
  14.   }
  15. }


由上面的程式碼,我們可以瞭解到,當呼叫到reduce時,通常會先執行一個setup函式,最後會執行一個cleanup函式。而預設情況下,這兩個函式的內容都是nothing。因此,當reduce不符合應用要求時,可以試著通過增加setup和cleanup的內容來滿足應用的需求。

相關文章