好程序員大數據學習路線分享MAPREDUCE,需求:統計大量的文本文件中的單詞出現的次數
- 1)整個運算需要分階段
- 階段一:並行局部運算
- 階段二 :彙總處理,不同的階段需要開發不同的程序
- 2)階段之間的調用
- 3)業務程序(task程序)如何併發到集羣並啓動程序
- 4)如何監控task程序的運行狀態,如何處理異常
- ::這些問題是開發分佈式程序都會面臨的問題,完全可以封裝成框架::
MR 的結構 - 一個完整的MapReduce運行時有三類實例進程:
- 1)MRAppMaster : 負責整個程序的過程調度和狀態調度
- 2)mapTask:負責map階段的整個數據處理流程
- 3)ReduceTask:負責reduce階段的整個數據處理流程
MR設計框架
::MAPERDUCE詳細框架::- 1)資源如何分發? ::放到HDFS:::中不能由客戶端發送,如果配置1000臺機器,也不能做pipeline,所以,可以把jar放在HDFS中的一個目錄下。
- 2)雖然有上千臺機器,現在job只需要20臺機器即可完成,由誰決定是哪20臺機器?::ResourceManager:: 作爲master
- 3)worker--NODEMANAGER,執行應用程序,監控應用程序的資源使用情況(cpu,磁盤,網絡,硬盤)並且向調度器ResourceManager彙報
::作業提交流程::
- 1)客戶端提交作業給resourcemanager
- 2)resourcemanager返回jobid,存儲路徑path信息
- 3)客戶端將job.jar 、job.split(確定需要運行多少task)、job.splitinfo等資源上傳到HDFS的存儲路徑
- 4)上傳到hdfs完成後,客戶端通知resourcemanager啓動job
- 5)resourcemanager將job加入到job等待隊列,然後nodemanager啓動container,將資源下載到container內,向客戶端發出請求啓動master
- 6)Appmaster向resourcemanager請求maptask的資
- 7)resourcemanager分配資源,從hdfs下載jar到container中,master啓動maptask,通過心跳機制,檢查job.split
- 8)maptask執行完成,通知Appmaster,釋放maptask資源。
分片機制
::如何確定需要運行多少task(並行度)::
-
決定需要多大的並行度
- map階段並行度:客戶端首先查看一下待處理數據目錄下的數據量
/data/a.txt 1G
/data/b.txt 800M - 循環遍歷:對每個文件看文件有多少個block,將block數量累加到計數器
-
返回一任務規劃描述文件:job.split:
- [ ] split0: /data/a.txt 0-128M
- [ ] split1: /data/a.txtx 128-256M
….. - [ ] split8: /data/b.txt 0-128M
寫入HDFS中
- 分片和分塊不同:
- 分片是邏輯概念,給task一個數據處理的範圍
- 存在冗餘(10%),偏移量和數據大小
- map階段並行度:客戶端首先查看一下待處理數據目錄下的數據量
- 特性:移動計算(jar包中封裝的計算)而不是移動數據
編寫MR程序的步驟:
1、用戶編寫程序分爲三個部分:Mapper、Reducer、Driver
2、Mapper的輸入數據是kv對的形式(數據類型可自定義)
3、Mapper的輸出數據是kv對的形式(數據類型可自定義)
4、Mapper中的業務邏輯寫在map()方法中
5、Map()方法對每一對kv值調用一次
6、Reducer的輸入數據是kv對的形式(數據類型可自定義)
7、Reducer的輸出數據是kv對的形式(數據類型可自定義)
8、Reducer中的業務邏輯寫在reduce()方法中
9、ReduceTask進程對每一組相同的key的<k,v>調用一次reduce()方法
10、用戶自定義的Mapper、Reducer類都要繼承各自的父類
11、整個程序需要一個Driver來進行提交,提交是一個描述了各種必要信息的job對象
- 案例:wordcount
- 需求:有一批數據文件(TB或者PB級別的數據),如何統計這些文件中的單詞出現次數