MapReduce學習筆記

MapReduce學習筆記

mapreduce提供了簡潔的編程接口,對某個計算任務來說,其輸入是key/value數據對,輸出也以key/value形式表示。開發只需實現Map和reduce兩個接口函數內的具體操作內容,即可完成大規模數據的並行批處理任務。
map函數以key/value數據對作爲輸入,將輸入數據經過業務邏輯計算產生若干仍以key/value形式表達的中間數據。mapreduce計算框架自動將中間結果中相同key的記錄進行聚集。並將數據傳送給reduce函數內定義好的處理邏輯作爲其輸入值。
reduce函數接收到map階段傳過來的某個key值及其對應的若干value值等中間數據,函數邏輯對這個key對應的value內容進行處理,一般是對其進行累加、過濾、轉換等操作,生成key/value形式的結果作爲最終結果。
介紹了一點理論以後,傑哥要舉栗子啦^-^雖然傑哥愛健身,但是太沉的栗子也舉不動~~
例1,單詞統計
傑哥有一天收集了感興趣的互聯網網頁內容(文檔),發現居然有13億個(哇塞,每位中國人送一個^-^),這麼多,想要統計下每個單詞的出現次數,快速瀏覽一遍都要累嗝屁了。。。還好有mapreduce兄,他就說了,放開那個單詞妹子讓我來:

map(String key,String value){  //產生中間數據<w,1>
  //key 網頁名
  //value 網頁內容
  for each word w in value
    emit Intermediate(w,“1”);
}  
reduce(String key,Iterator values){
  //key 單詞
  //values 出現次數列表
  int result = 0for each v in values;
    result += ParseInt(v);
  emit(AsString(result));  
}

例2,pv統計
傑哥實習的時候經常接觸到一個詞較做pv,即頁面點擊數,對log統計pv如何進行呢?mapreduce兄又來了

map(String tuple_id,String tuple){
   emit Intermediate(url,“1”); 
}
reduce(String url,Iterator list_tuples){
  int result = 0;
  for each v in list_tuples;
    result += ParseInt(v);
  emit(AsString(result));
}

mapreduce處理流程:
1.mapreduce框架將應用的輸入數據切分成M個數據塊,一般每個大小64MB,啓動集羣中不同機器上的若干程序
2.唯一的主控(master)爲若干worker分配map或者reduce任務,並進行全局管理
3.進行map的worker讀取對應的數據塊內容,從數據塊中解析出一個個key/value記錄數據並傳給map函數,map處理後輸出key/value中間結果緩存於內存中
4.緩存的中間結果週期性的被寫入本地磁盤,每個中間結果在寫入磁盤前被分割(partition)成R份,例如通過key對R進行哈希取模,每一份對應一個reduce的數據分片臨時文件,map處理完後通知master,由master轉交給reduce中的worker
5.shullfe階段:當某個reduce接收到master通知時,就通過RPC遠程調用將map產生的屬於自己的數據文件遠程取(pull)到本地。只有所有map完成時,reduce才能啓動。所有中間數據拉取成功後,reduce根據中間數據的key進行排序,將相同的key聚合在一起,注意,reduce採取主動接收數據方式,即pull,這樣某個reduce失敗後直接重新執行這個reduce即可。reduce任務的worker遍歷完中間結果並排序後,將同一個key及其對應的多個value傳遞給reduce函數進行計算
6.所有map和reduce執行完後,master喚醒用戶應用程序,mapreduce調用結束。

一般情況,在map後加入combiner對一個map內的結果先進行聚合,以減少map和reduce之間的通信代價,也可以在map中集成combiner的功能,減少i/o代價。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章