大資料學習筆記之分散式並行處理MapReduce
阿新 • • 發佈:2018-12-18
谷歌公司最先提出了分散式並行程式設計模型MapReduce,Hadoop MapReduce是它的 開源實現,後者比前者使用門檻低很多。
MapReduce和傳統的平行計算框架的比較
傳統平行計算框架 | MapReduce | |
---|---|---|
叢集架構/容錯性 | 共享式(共享式儲存/共享記憶體) | 非共享式,容錯性好 |
硬體/價格/擴充套件性 | 刀鋒伺服器、高速網、SAN、價格貴,擴充套件性差 | 普通PC機,便宜,擴充套件性好 |
程式設計/學習難度 | what-how,難 | what,簡單 |
使用場景 | 實時、細粒度計算、計算密集型 | 批處理、非實時、資料密集型 |
1.MapReduce模型簡介
- MapReduce將複雜的、運行於大規模叢集上的平行計算過程高度地抽象到了兩個函式:Map和 Reduce
- 程式設計容易,不需要掌握分散式並行程式設計細節,也可以很容易把自己的程式執行在分散式系統上,完
成海量資料的計算 - MapReduce採用“分而治之”策略,一個儲存在分散式檔案系統中的大規模資料集,會被切分成 許多獨立的分片(split),這些分片可以被多個Map任務並行處理
- MapReduce設計的一個理念就是“計算向資料靠攏”,而不是“資料向計算靠攏”,因為,移動
資料需要大量的網路傳輸開銷 - MapReduce框架採用了Master/Slave架構,包括一個Master和若干個Slave。Master上執行 JobTracker,Slave上執行TaskTracker
- Hadoop框架是用Java實現的,但是,MapReduce應用程式則不一定要用Java來寫
2.MapReduce體系結構
MapReduce體系結構主要由四個部分組成,分別是:Client、JobTracker、TaskTracker以及Task,如下圖:
- Client 使用者編寫的MapReduce程式通過Client提交到JobTracker端,使用者可通過Client提供的一些介面檢視作業執行狀態
- JobTracker 負責資源監控和作業排程 ,JobTracker會監控所有TaskTracker與Job的健康狀況,一旦發現失敗,就將相應的任務轉移到其他節點,JobTracker 會跟蹤任務的執行進度、資源使用量等資訊,並將這些資訊告訴任務 排程器(TaskScheduler),而排程器會在資源出現空閒時,選擇合適的任務去使用這些資源
- TaskTracker TaskTracker 會週期性地通過“心跳”將本節點上資源的使用情況和任務的執行進 度彙報JobTracker,同時接收JobTracker 傳送過來的命令並執行相應的操作(如啟動新任務、殺死任務等),TaskTracker 使用“slot”等量劃分本節點上的資源量(CPU、記憶體等)。一個Task 獲取到一個slot 後才有機會執行,而Hadoop排程器的作用就是將各個TaskTracker 上的空閒slot分配給Task使用。slot 分為Map slot 和Reduce slot 兩種,分別供 MapTask 和Reduce Task 使用
- Task Task 分為Map Task 和Reduce Task 兩種,均由TaskTracker 啟動
2.1 工作流程
2.2MapReduce各個執行階段
- Split(分片) HDFS 以固定大小的block 為基本單位儲存資料,而對於MapReduce 而言,其處理單位是split。split 是一個邏輯概念,它只包含一些元資料資訊,比如資料起始位置、資料長度、資料所在節點等。 split的劃分方法完全由使用者自己決定。
- Map任務的數量 Hadoop為每個split建立一個Map任務,split 的多少決定了Map任務的數目。 大多數情況下,理想的分片大小是一個HDFS塊
- Reduce任務的數量最優的Reduce任務個數取決於叢集中可用的reduce任務槽(slot)的數目,通常設定比reduce任務槽數目稍微小一些的Reduce任務個數(這樣可以預留 一些系統資源處理可能發生的錯誤)
Shuffle過程詳解
shuffle過程,是指對Map輸出結果進行分割槽、排序、合併等處理並交給Reduce的過程,因此Shuffle過程可以分為Map端的操作和Reduce端的操作,