2017-06-03 71 views
2

我對MapReduce完全陌生,無法理解需要根據每個分區中的鍵對映射器輸出進行排序。最終,我們需要的是,一個減速器供給一個由多對<key,List of Values>組成的分區,並且每對中的密鑰不僅對於相應的分區是唯一的,而且對於被饋送到不同減速器的所有分區是唯一的。我們真的需要在MapReduce框架中進行排序嗎?

爲了做到這一點,需要在任何階段做sort。我們不能使用hash table來分組對應於相同密鑰的值嗎?

分解爲每個階段。在映射階段,對於每個輸出對,我們只需散列密鑰來查找分區號,然後將相應的對添加到屬於同一分區的所有這些對的鏈接列表中。所以最後,單個映射器獲得的輸出將是hashtable。其中對於每個分區編號,我們都有一個<key,value>對的鏈表,其中沒有任何基於密鑰的順序,即對於相似的鍵值沒有位置。

然後將來自不同映射器任務的分區混洗到reducer。我們現在需要確保我們先將所有對應於相同鍵的值(合併類型)分組,然後將這些合併的對<key,List of Values>提供給單獨的縮減器函數。在這裏我們可以再次使用hashtable來做同樣的事情,我們只需遍歷所有的分區,並且爲每個鍵映射它們到散列表中的索引,並將相應的值附加到散列表中的鏈表中。 與我們對每個映射器的輸出進行排序的方法相比,這種方法不會節省更多時間嗎?

我已經通過了link(我目前還不能在線程上發表評論,所以我寫了一個單獨的問題。)頂端回答中提到,

排序的減速可以節省時間,幫助它容易區分何時開始新的減少任務。簡單地說,當排序的輸入數據中的下一個鍵與前一個鍵不同時,它只是啓動一個新的減少任務。每個reduce任務都會獲取一組鍵值對,但必須調用reduce()方法,該方法採用鍵列表(值)輸入,因此必須按鍵對值進行分組。這很容易做到,如果輸入的數據是在映射階段預先排序(本地),在減少相簡單歸併排序(因爲減速許多映射器獲得數據)

但是同樣我們可以做通過使用哈希表相同或我們不能?

回答

0

嗯,是的,只要一切都適合內存,就可以使用散列表。但是一旦您使用的數據量超過了計算機的內存容量,就會出現問題。

解決方案是將數據輸出到磁盤文件並進行外部排序。

相關問題