我試圖使用Python MRJob lib執行mapreduce作業,並且遇到了一些問題讓它在我的Hadoop集羣中正確分佈。我相信我只是想念mapreduce的基本原理。我的集羣是一個小的,一個主從一個測試集羣。基本思想是我只是請求一系列帶參數的網頁,對它們進行一些分析並返回網頁上的一些屬性。MRJob和mapreduce通過Hadoop進行任務分區
輸入到我的映射函數是簡單的URL與參數,如下面的列表:
http://guelph.backpage.com/automotive/?layout=bla&keyword=towing
http://guelph.backpage.com/whatever/?p=blah
http://semanticreference.com/search.html?go=Search&q=red
http://copiahcounty.wlbt.com/h/events?ename=drupaleventsxmlapi&s=rrr
http://sweetrococo.livejournal.com/34076.html?mode=ffff
使得對於初始輸入的鍵 - 值對只是關鍵:無,VAL:URL 。
以下是我的地圖功能:
def mapper(self, key, url):
'''Yield domain as the key, and (url, query parameter) tuple as the value'''
parsed_url = urlparse(url)
domain = parsed_url.scheme + "://" + parsed_url.netloc + "/"
if self.myclass.check_if_param(parsed_url):
parsed_url_query = parsed_url.query
url_q_dic = parse_qs(parsed_url_query)
for query_param, query_val in url_q_dic.iteritems():
#yielding a tuple in mrjob will yield a list
yield domain, (url, query_param)
很簡單,我只是檢查,以確保該網址含有參數和產生的URL的域密鑰和元組給我的網址和查詢參數的值MRJob好心轉變成一個列表傳遞給減速,這是如下:
def reducer(self, domain, url_query_params):
final_list = []
for url_query_param in url_query_params:
url_to_list_props = url_query_param[0]
param_to_list_props = url_query_param[1]
#set our target that we will request and do some analysis on
self.myclass.set_target(url_to_list_props, param_to_list_props)
#perform a bunch of requests and do analysis on the URL requested
props_list = self.myclass.get_props()
for prop in props_list:
final_list.append(prop)
#index this stuff to a central db
MapReduceIndexer(domain, final_list).add_prop_info()
yield domain, final_list
我的問題是,只有一個減速運行任務。我希望Reducer任務的數量等於映射器發出的唯一鍵的數量。上面代碼的最終結果是我有一個reducer,它運行在master上,但slave只是空着坐着,什麼也不做,這顯然不理想。我注意到在我的輸出中開始了一些mapper任務,但始終只有1個reducer任務。除此之外,任務可以順利進行,並且按預期工作。
我的問題是......我做錯了什麼?我是否誤解了減少步驟,或者在某個地方搞砸了我的鍵值對?爲什麼沒有多個減速器在這項工作上運行?
更新:好吧,從給出的答案我把mapred.reduce.tasks增加到更高(這是我現在認識到的默認值是1)。這確實是我得到1減速器的原因。我現在看到3個減少任務正在同時執行。我現在有一個導入錯誤在我的奴隸需要解決,但至少我得到的地方...
嗯,如果是這種情況,我可能不明白朮語「減少任務」。在我看來,如果映射器輸出3個唯一的鍵,reduce函數需要運行3個不同的時間來完成mapreduce任務。對我來說,這應該是「3減少任務」,這3個任務應該分佈在整個集羣中,情況並非如此? – acnutch
作爲更新,你是正確的,謝謝!我現在有多個同時運行的reduce任務。但是,他們都會被送到主人手中,而沒有人會被送到奴隸手中! – acnutch