2014-03-13 43 views
1

我知道在Hadoop MapReduce中包含一個組合器(包括我已經完成的)。如何在Hadoop MapReduce中實現組合器?

conf.setCombinerClass(MyReducer.class); 

我不明白的是,我在哪裏實際上實現了組合器的功能。我在MyReducer下創建了一個combine {}方法嗎?如減少方法;

public void reduce(Text key, Iterator<IntWritable> values, 
    OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { } 

非常感謝提前!

回答

4

A Combiner應該只是一個Reducer,並因此實現了接口(沒有Combiner接口)。將組合步驟想象爲在MapperReducer之間的中間減少步驟。

以Word Count爲例。從Yahoo's tutorial

字數是組合器有用的一個主要示例。列表1--3中的字數統計程序爲每個看到的單詞發出一個(單詞,1)對。因此,如果同一文件包含3次「cat」這個詞,那麼這個對(「cat」,1)會發出三次;所有這些然後被髮送到減速器。通過使用Combiner,這些可以被壓縮成一個單一的(「貓」,3)對發送到Reducer。現在,每個節點只爲每個單詞發送一個單值給reducer - 大大減少了混洗過程所需的總帶寬,並加快了工作速度。最好的部分是我們不需要編寫任何額外的代碼來利用它!如果reduce函數既可交換又可關聯,那麼它也可以用作Combiner。

希望有所幫助。

0

考慮到你的代碼段,你只需要像往常一樣實施你的reduce()方法,這裏沒有什麼特別的。但是,請記住,組合器功能是一種優化。這意味着Hadoop不會保證它會爲特定的映射輸出調用它多少次。它可能根本不會調用它。

如果您檢查Hadoop Reducer類的API,您會找到reduce()方法。沒有combine()或其他方法來覆蓋。

+0

我剛剛意識到我已經問過如何「實現減速器的功能」而不是「組合器」,對於現在已修復的問題感到抱歉。你能再請回答嗎? – ali

+0

@ali取決於你的情況和你的數據。不能說 – Chiron