2016-08-01 58 views
1

我讀教程的MapReduce與合 http://www.tutorialspoint.com/map_reduce/map_reduce_combiners.htm如果沒有合成階段的縮減器,減速器的輸入將會是什麼?

減速機接收來自組合下面輸入

<What,1,1,1> <do,1,1> <you,1,1> <mean,1> <by,1> <Object,1> 
<know,1> <about,1> <Java,1,1,1> 
<is,1> <Virtual,1> <Machine,1> 
<How,1> <enabled,1> <High,1> <Performance,1> 

我的疑問是,如果我跳過組合,並允許映射到輸出傳遞到 的無需執行任何分組操作(不使用組合器),並允許它通過混洗和分類階段。

減法器在映射階段結束後經過混洗和排序階段後會接收到什麼輸入?

我可以檢查減速機接收到什麼輸入嗎?

回答

0

我會說你從那個教程看的輸出可能有點不對。由於它是由減速器重用的代碼組合級的組合輸出實際上是這樣的:

<What,3> <do,2> <you,2> <mean,1> <by,1> <Object,1> 
<know,1> <about,1> <Java,3> 
<is,1> <Virtual,1> <Machine,1> 
<How,1> <enabled,1> <High,1> <Performance,1> 

在這個例子中,你完全可以不使用結合起來,最終的結果將是相同的。在您有多個映射器和縮減器的場景中,組合器只會對映射器的輸出執行一些本地聚合,而reduce則會進行最終聚合。

如果您在沒有聯合收割機的情況下運行,您仍然會在縮減階段獲得基於關鍵字的組合。聯合收割機將在地圖輸出中爲您做一些本地聚合。

reduce的輸入只是由mapper寫入的輸出,但是按鍵分組。

+0

我想在上面的示例教程中指出reducer運行兩次,如果我們使用組合器。一次執行分組並再次發出輸出。我在reducer代碼中使用了system.out .println,並在日誌中看到了輸出。最初它執行分組,然後減速器發出。 mapreduce的結果與使用和不使用combiner相同。 – raj

+0

這是錯誤的'一旦執行分組並再次發出輸出'。組合操作在映射器的輸出上運行,這通常是給定鍵的值的子集,它們沒有被混洗和排序。只有一次減少運行,您才能保證擁有某個鍵的所有鍵/值對。因此,在這種情況下,組合器可以進行一些前期聚合以減少通過網絡發送的數據量,然後減少運行完成作業。 –

+0

我的意思是說減速機起到組合器以及減速機的作用。最初在減速器的for循環中,執行給出組合器輸出的字的求和,然後將該輸出作爲減速器階段的輸入。現在,對於的val.get將給出3,並且同樣由reducer發出作爲最終輸出。 – raj