2013-01-16 83 views
4

我正在使用yelps MRJob庫來實現map-reduce功能。我知道map reduce有一個內部排序和隨機算法,它根據它們的鍵對值進行排序。所以,如果我有地圖階段後的結果如下mapreduce如何排序和洗牌工作?

(1, 24) (4, 25) (3, 26) 

我所知道的排序和洗牌階段將產生以下輸出

(1, 24) (3, 26) (4, 25) 

這是預期

但是,如果我有兩個相似的鑰匙和不同的值爲什麼排序和混洗階段會根據出現的第一個值對數據進行排序?

例如 如果我有值從映射器下面的列表

(2, <25, 26>) (1, <24, 23>) (1, <23, 24>) 

預期的輸出是

(1, <24, 23>) (1, <23, 24>) (2, <25, 26>) 

但是,我得到的輸出是

(1, <23, 24>) (1, <24, 23>) (2, <25, 26>) 

這是MRjob庫特定的嗎?無論如何,要根據數值來停止這種排序嗎?

CODE

from mrjob.job import MRJob 
import math 

class SortMR(MRJob): 



def steps(self): 
    return [ 
     self.mr(mapper=self.rangemr, 
       reducer=self.rangesort)] 


def rangemr(self, key, line): 
    for a in line.split(): 
     yield 1,a 


def rangesort(self,numid,line): 
    for a in line: 
     yield(1, a) 


if __name__ == '__main__': 
    SortMR.run() 

回答

3

本地MRjob只是在映射器輸出上使用操作系統'sort'。

映射器在格式寫出:

關鍵< -tab->值\ n

因此你最終主要由鍵排序鍵,但其次是由價值。

如上所述,這不會發生在真正的hadoop版本中,只是'本地'模擬。

+0

對不起,在這裏提問:如何在運行本地時禁止按值排序? –

0

排序&洗牌階段不值的順序是減速獲取給定鍵上gaurantee。

+0

引用請 –

0

排序在hadoop是基於關鍵,因此它不能保證值的順序。

4

「排序」值的唯一方法是使用包含來自值本身的一些信息的組合鍵。然後,您的鍵的compareTo方法可以確保鍵首先由實際的鍵組件排序,然後再由值組件排序。最後,您需要一個組分區器來確保在reducer中所有具有相同'key'組件的鍵(實際鍵)都被認爲是相等的,並且關聯的值在一次調用reduce方法時迭代。

這就是所謂的「二次排序」,question similar這個提供了一些例子的鏈接。

+0

顯然,根據我使用mrjob庫所看到和開發的內容,我收到的值是根據鍵以及我在地圖末尾的值列表中提供的第一個值相。我沒有專門編寫組合鍵或任何方法來處理這些鍵。 –

+0

今天我實際上在EMR上實現了這項工作,並且令人驚訝的是輸出沒有被排序。我想只有在本地機器上運行作業時纔會發生這種情況。 –

+0

它是否在本地運行並不重要。謹慎發佈你的代碼? –