天天看點

《Hadoop MapReduce實戰手冊》一1.4 給WordCount MapReduce程式增加combiner步驟

本節書摘來異步社群《hadoop mapreduce實戰手冊》一書中的第1章,第1.4節,作者: 【美】srinath perera , thilina gunarathne 譯者: 楊卓荦 責編: 楊海玲,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

hadoop mapreduce實戰手冊

運作map函數後,如果有許多鍵值對使用相同的鍵,那麼hadoop必須将所有這些值傳送到reduce函數。這可能會産生一個非常顯著的開銷。為了優化這樣的場景,hadoop支援一個專門的函數——combiner。如果配置了combiner,hadoop會在運作完成mapper之後、調用reducer之前,在map節點所在的那個節點調用combiner。這可以顯著地減少傳輸到reduce步驟的資料量。

本節将說明如何在1.3節介紹的wordcount示例程式中使用combiner。

操作步驟

現在,讓我們加入combiner配置來運作mapreduce作業。

1. combiner必須和reduce函數具有相同的接口。對于wordcount示例程式,我們将會複用

reduce函數作為combiner。

2. 為了讓mapreduce作業使用combiner,需要在示例程式中取消//job.setcombinerclass.

(intsumreducer.class);這行的注釋,然後重新編譯代碼。

3. 将hadoop-cookbook-chapter1.jar檔案複制到hadoop_home目錄,并且用前一節介紹的方式運作wordcount。確定運作作業之前删除了舊的輸出目錄。

4. 最終結果會放在output目錄下。

工作原理

要激活combiner,使用者應該提供mapper、reducer和combiner作為mapreduce作業的輸入。在該環境中,一旦mapper函數執行完成,hadoop就在mapper函數所在的節點上執行combiner。使用這種方法,combiner可以預先處理mapper所産生的資料,然後再将結果發送給reducer,進而減少轉移的資料量。

例如,wordcount示例,combiner從map步驟接收多個(word, 1)對作為輸入,并輸出一個(word, n)對。例如,如果輸入文檔中單詞“the”出現了10 000次,那麼mapper将産生10 000個(the, 1)對,而combiner将隻産生一個(the, 10,000),進而減少傳輸給reduce任務的資料量。

然而,combiner隻适用于滿足代數交換律和結合律的函數。例如,同樣的思路對計算平均值就會無效。由于平均值是不滿足交換律和結合律的,在這種情況下,combiner将會得到一個錯誤的結果。

更多參考

雖然在示例程式中,我們是複用reduce函數實作的combiner功能,你也可以寫自己的combiner函數,就像我們在前一節中介紹的map和reduce函數。然而,combiner函數的簽名必須與reduce函數的簽名完全一緻。

在本地配置hadoop的情況下,使用combiner不會産生顯著的收益。然而,如1.8節所述,在分布式的叢集環境中,combiner可以提供顯著的收益。

繼續閱讀