1

假設有N個單詞集,我想從這些集創建映射,以便將單詞映射到所有這些集中的單詞出現次數。使用Map/Reduce從多個集創建映射

例如:

 
N = 3 
S1 = {"a", "b", "c"}, S2 = {"a", "b", "d"}, S3 = {"a", "c", "e"} 
M = { "a" -> 3, "b" -> 2, "c" -> 2, "d" -> 1, "e" -> 1} 

現在我有M計算機使用。因此,我可以讓每臺電腦都創建一個N/M集合的地圖。在第二個(最後)階段,我可以從M地圖創建地圖。看起來像一個map/reduce。是否有意義 ?你會如何改進這種方法?

回答

2

這是標準地圖縮小示例。

例如這裏是一個基於mincemeat map/reduce library Python代碼:

#!/usr/bin/env python 
import mincemeat 

S1 = {"a", "b", "c"} 
S2 = {"a", "b", "d"} 
S3 = {"a", "c", "e"} 

datasource = dict(enumerate([S1,S2,S3])) 

def mapfn(k, v): 
    for w in v: 
     yield w, 1 

def reducefn(k, vs): 
    result = sum(vs) 
    return result 

s = mincemeat.Server() 
s.datasource = datasource 
s.mapfn = mapfn 
s.reducefn = reducefn 

results = s.run_server(password="changeme") 
print results 

打印

{'a': 3, 'c': 2, 'b': 2, 'e': 1, 'd': 1} 

注意,地圖/減少的結構方式意味着服務器作爲賦予了新的任務給客戶他們完成他們的任務。

這意味着不一定有N/M任務固定分區到每個客戶端。

如果一個客戶端比其他客戶端更快,那麼最終會被賦予更多的任務,以便充分利用可用資源。

+0

你說「服務器在客戶完成任務時給予新任務」。這是所有'map/reduce'實現(包括'Hadoop')的工作方式嗎? – Michael

+0

其他實現的基本原理是通用的,儘管在實踐中存在優化以試圖在靠近相關數據的節點上完成處理,並且嘗試排隊以縮短等待新任務的時間。以下是有關Hadoop計劃程序算法的更多詳細信息:http://en.wikipedia.org/wiki/Apache_Hadoop#JobTracker_and_TaskTracker:_the_MapReduce_engine –