2013-01-02 59 views
2

我試圖使用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個減少任務正在同時執行。我現在有一個導入錯誤在我的奴隸需要解決,但至少我得到的地方...

回答

0

減速器的數量是完全無關的輸入數據的形式。對於MRJob,看起來你需要bootstrap options

+0

嗯,如果是這種情況,我可能不明白朮語「減少任務」。在我看來,如果映射器輸出3個唯一的鍵,reduce函數需要運行3個不同的時間來完成mapreduce任務。對我來說,這應該是「3減少任務」,這3個任務應該分佈在整個集羣中,情況並非如此? – acnutch

+0

作爲更新,你是正確的,謝謝!我現在有多個同時運行的reduce任務。但是,他們都會被送到主人手中,而沒有人會被送到奴隸手中! – acnutch