我對MapReduce完全陌生,無法理解需要根據每個分區中的鍵對映射器輸出進行排序。最終,我們需要的是,一個減速器供給一個由多對<key,List of Values>
組成的分區,並且每對中的密鑰不僅對於相應的分區是唯一的,而且對於被饋送到不同減速器的所有分區是唯一的。我們真的需要在MapReduce框架中進行排序嗎?
爲了做到這一點,需要在任何階段做sort
。我們不能使用hash table
來分組對應於相同密鑰的值嗎?
分解爲每個階段。在映射階段,對於每個輸出對,我們只需散列密鑰來查找分區號,然後將相應的對添加到屬於同一分區的所有這些對的鏈接列表中。所以最後,單個映射器獲得的輸出將是hashtable
。其中對於每個分區編號,我們都有一個<key,value>
對的鏈表,其中沒有任何基於密鑰的順序,即對於相似的鍵值沒有位置。
然後將來自不同映射器任務的分區混洗到reducer。我們現在需要確保我們先將所有對應於相同鍵的值(合併類型)分組,然後將這些合併的對<key,List of Values>
提供給單獨的縮減器函數。在這裏我們可以再次使用hashtable
來做同樣的事情,我們只需遍歷所有的分區,並且爲每個鍵映射它們到散列表中的索引,並將相應的值附加到散列表中的鏈表中。 與我們對每個映射器的輸出進行排序的方法相比,這種方法不會節省更多時間嗎?
我已經通過了link(我目前還不能在線程上發表評論,所以我寫了一個單獨的問題。)頂端回答中提到,
排序的減速可以節省時間,幫助它容易區分何時開始新的減少任務。簡單地說,當排序的輸入數據中的下一個鍵與前一個鍵不同時,它只是啓動一個新的減少任務。每個reduce任務都會獲取一組鍵值對,但必須調用reduce()方法,該方法採用鍵列表(值)輸入,因此必須按鍵對值進行分組。這很容易做到,如果輸入的數據是在映射階段預先排序(本地),在減少相簡單歸併排序(因爲減速許多映射器獲得數據)
但是同樣我們可以做通過使用哈希表相同或我們不能?