2012-07-31 69 views
6

我是新來的hadoop在這裏。目前尚不清楚爲什麼我們需要在使用hadoop mapreduce的同時按鍵排序?在映射階段之後,我們需要將與每個唯一鍵相對應的數據分配給一定數量的縮減器。這可以在不需要對其進行排序的情況下完成?MapReduce階段中使用的Sort是什麼,爲什麼?

回答

14

它在那裏,因爲排序是一個巧妙的組合你的密鑰。當然,如果你的工作或算法不需要你的密鑰的任何順序,那麼通過一些散列技巧你可以更快地進行分組。

在Hadoop本身,已經有一個JIRA提交了多年以來(source)。 Hadoop之上的其他幾個發行版已經具備了這些功能,例如Hanborq(他們稱之爲排序避免)。 (source

您的實際問題(爲什麼),MapReduce的是本質上來自谷歌(source)一個文件,其中規定如下:

我們保證給定的分區中,中間的鍵/值 對按照遞增的按鍵順序進行處理。這種排序保證 可以很容易地生成每個分區排序的輸出文件,當輸出文件格式需要通過關鍵支持高效隨機 訪問查詢,或用戶輸出的發現可以方便地 有這 有用數據排序。

所以這是一個更方便的決定,以支持排序,但不是固有的只允許排序組鍵。

+0

感謝Matt對源代碼的編輯。 – 2012-07-31 19:18:02

+0

謝謝Thomas!這解釋了它! – user428900 2012-07-31 20:48:17

+0

在我看來,hadoop確實在地圖輸出被分散到磁盤中時開始初始排序(排序發生在將記錄移動到溢出之前)隨後它會合並排序(成本相對較低),並且從開始鍵排序也有助於組合器被調用,排序鍵有助於調用reducer,因此排序是一個好主意。 – Kalai 2016-04-01 12:39:42

1

如果我們通過向不同的機器發送不同的密鑰來考慮hadoop DISTRIBUTES進程的事實,可以最好地理解「按鍵排序」。這個想法的基礎(簡體)版本是這樣的:

The reducer which a (k,v) pair is sent to = k.hashCode()%num_of_machines. 

所以,如果我的鑰匙的哈希碼是10,我有2臺機器,鑰匙就會被髮送到機#0,例如。

因此,密鑰將(第一次)給我們一個簡單的方法來分配計算。

除了簡化計算分佈之外,按鍵還爲我們提供了一種將來自不同數據文件的記錄連接到單個羣集的方法。例如,我們可以這樣做,比如word_count。

事實上,如果你發現你不需要鑰匙---你可能也不需要hadoop!

典型的例子(單詞計數):

在hadoop的「詞數」的例子,我們發射具有值的鍵(一個密鑰=一個字)(#倍字被認爲在的段文本)。這允許SINGLE縮減功能接收單個單詞,並因此添加所有被查看的時間,從而創建精確的單詞計數。

因此,密鑰的聚合是允許「地圖」階段獨立分佈在多個機器上的。如果沒有將鍵集合到同一個縮減器中,在單詞計數示例中,我們可能會針對給定單詞獲得幾個單詞計數,因爲沒有一個單獨的縮減器會從所有文件接收所有單詞計數。

又如:

現在...讓我們說我們有社會安全號碼作爲ID和我們要輸出的個人數據的集合。可以說我們有2個大文件。

ssn->名稱

ssn-> shoe_size

在這種情況下,我們可以利用關鍵組的功率,使得個人名字和鞋子尺寸都發送到相同的降低作用。

減速機(2)將在這裏得到2個記錄:

ssn->名稱,shoe_size

這裏的想法是,寫地圖時/ reduce作業,你必須編碼你的 「元組」 是以減少階段以有意義的方式將它們連接在一起的方式輸出。任何分佈式計算環境在某些時候都可能需要合併在不同節點中計算的記錄。 Keys爲我們提供了一個方便可擴展的方法。

因此 - 我們確信SAME鍵進入SAME reducer功能的事實證明,針對此特定社會安全號碼的EACH減速器將接收與該號碼關聯的所有數據,從而允許我們加入並輸出數據記錄其中包括ssn,名稱和鞋號。

結論

沒有以這樣的方式通過鍵分配,接合數據將需要涉及某種中間數據存儲/緩存的痛苦複雜的邏輯。 Hadoop簡單地概括和抽象了通過使用熟悉的pardigm:鍵和值來「併入」來自並行計算的數據結果的常見需求。

相關問題