MapReduce大數據處理模型

介紹

MapReduce是處理和產生大數據集的編程模型。用戶先使用map函數接受一個KV對,生成中間的KV對,再將相同key的值合併,送到reduce函數處理。

模型需要考慮的問題

  1. 併發處理
  2. 容錯處理
  3. 數據分佈處理
  4. 負載均衡
  5. 其它

編程模式

map函數:輸入一對kv,輸出中間kv。
reduce函數:接受map函數輸出的中間kv,並且處理相同key的value集合,輸出0個或者1個值。

實現

一、整體流程圖
在這裏插入圖片描述
二、步驟:

  1. 先將輸入文件分成M塊,每塊大概16M到60M(根據參數決定),再在集羣中執行處理程序。
  2. 程序由主控任務master,實際處理任務worker組成。worker分爲map任務和reduce任務,這裏總共由M個map任務和R個reduce任務。
  3. map接受分配到的輸入數據塊,並將數據解析成key/value對傳給map函數處理,生成中間key/value並暫時緩存到內存。
  4. 定時的將上步生成的中間key/value刷新到磁盤,並且通過分區函數分成R個區,然後將這些分區的位置信息發送回master。master再將分區的位置信息發送給reduce的worker。
  5. 當reduce任務接收都來自master發送的中間key/value位置信息時,它通過rpc向map任務讀取磁盤上的數據,讀取完數據後需要先排序,這樣把相同key的key/value都整合在一起,如果數據太大則需要外排序。
  6. reduce任務再把排好序的key/value集合進行計算處理,輸出結果到文件(總共會有R個文件)。
  7. 當map和reduce任務都完成後,返回用戶程序。

三、實現的關鍵點

  1. master的數據結構:它需要保存map和reduce任務的狀態(idle,
    in-progress 或者 completed),並且識別不同worker任務。master需要接收並保存map任務處理完成的中間值位置信息,並且發送到reduce任務。
  2. 容錯考慮:worker失效考慮,master會定期ping worker,如果沒有返回則認爲是失效了,對於map任務如果失效,map任務執行完成則master需要重新分配它執行的任務,因爲它產生的中間值位置會丟。對於reduce任務失效且執行完成則無需再次執行,因爲它已經輸出到文件中。master失效考慮,在 master 中,定期會設定 checkpoint,寫出 master 的數據結構。如果 master 任務失效了,可以從 上次最後一個 checkpoint 開始啓動另一個 master 進程。
  3. 存儲位置:一般保存在本地磁盤通過GFS來管理。
  4. 任務粒度:map階段拆成M塊,reduce階段拆成R塊,M+R應該比worker的數量多得多,通常的比例大概是:M=20000,R=5000,worker數量2000
  5. 備用任務:對一些延時較長的任務(比如IO緩慢,網絡延遲等導致),使用備用任務來執行。

四、實現中一些優化或技巧(或者稱爲工程最佳實踐)

  1. 分區函數設計:主要是對分區粒度的把握,比如處理url時,有時是以url來分區,有時需要以hostname來分區
  2. key順序保證:key在分區中應該處理成有序的
  3. combiner函數:合併map處理結果,再通過網絡發送
  4. 輸入和輸出類型
  5. 邊界效應
  6. 跳過損壞的記錄
  7. 本地執行
  8. 狀態信息
  9. 計數器
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章