2012-03-01 82 views
1

爲什麼在MapReduce中需要Reduce?如果一項工作(例如統計書中單詞的數量)將導致相同的結果(如果由單個流程執行或MapReduced在服務器場中執行),那麼重複項必須被刪除的可能性有多大?我假定Reduce步驟,至少在本例中,將簡單地彙總來自每個工作進程的結果並提供本書中單詞的總數。我不明白哪裏有重複的東西出現在圖片中。是否總是需要刪除MapReduce中的重複項?

回答

1

Reduce步驟並不意味着刪除重複項(儘管在某些情況下這是一個可能的用例)。 Reduce是爲了彙總來自不同映射器的輸出而使用相同的密鑰。

例如,在單詞計數示例中,節點1可能會得到一個單詞的10個實例,例如「school」,節點2可能有15個實例,節點3 12個實例。現在如何計算總和?結果10,15和12在不同的節點上。有一個隨機播放階段,將所有這些值帶到一個節點(這是分區器分配給關鍵「學校」的縮減器)。然後減速器將具有該鍵的所有值,並且可以將它們相加。

編輯:由於鐸提到的,通過聚集我的意思是「彙集」

EDIT2的更一般意義上的聚集:爲了澄清RaffiM的疑問: 繼續上面的例子,假設節點1有1頁10,節點2有11-20頁,節點3有21-30頁。因此,在毛澤東之後,我們知道Pages 1-10有10次單詞「school」,11-20頁有15次出現,15-30次出現在第21-30頁。現在我們需要的是這個詞在整本書中出現的總次數,所以我們仍然需要添加這些詞。我們需要10 + 15 + 12 +其他頁面範圍的數字......

如果您不使用組合器,則映射器每次出現該單詞時都會發送「1」。因此,對於1-10頁,它將發送<「學校」,1>作爲輸出鍵值10次。爲了提高效率,我們使用組合器,在映射器級別對其進行彙總。因此,如果您使用組合器,它將在節點1本身中消耗此資源,併爲節點1生成合並輸出<「學校」,10>。

+0

在本書的例子中,爲什麼不發送頁面範圍到一個節點,節點統計該頁面範圍內的所有單詞..沒有比發送單個單詞更有效嗎? – raffian 2012-03-01 17:28:29

+0

這正是發生的情況。但是我們需要整本書中每個單詞的計數,而不是特定的頁面範圍。我會在答案中增加更多細節以使其更清楚。 – 2012-03-01 17:45:14

+0

我還是不明白......我們不計算單個詞的出現,只是總詞。 – raffian 2012-03-03 01:06:16

5

減少是一種更爲普遍的操作。這並不一定意味着「通過重複應用操作(例如求和)來聚合一堆數值」。的正式定義地圖,減少是,它是一個以下階段組成的轉化:

  1. Map: (K k, V v) -> (K' k, V' v1 [, v2,...]) - 即在輸入有一個鍵 - 值對分別類型K和V,的操作,併產生一個密鑰可能不同類型的值的值或鍵列表結果。
  2. 執行分區的混洗階段。
  3. Reduce: (K' k, V' v1 [, v2,...]) -> (K' k, V'' v1 [, v2,...]) - 一種操作,用於輸入值對的鍵值列表,其中「值列表」是由Map階段生成的與鍵k相對應的所有值的列表,並生成鍵值或鍵值。值列表配對,其中輸出密鑰必須與輸入密鑰具有相同的類型,並且該值爲任意類型。

這樣,您會發現Reduce操作更加靈活和一般。

相關問題