1.MapReduce原理
分而治之,一個大任務分成多個小的子任務(map),並行執行后,合並結果(reduce)
問題1:1000副撲克牌少哪一張牌(去掉大小王)
問題2:100GB的網站訪問日志文件,找出訪問次數最多的IP地址
- 將日志進行切分(比如按時間)
- 各自統計各IP的訪問次數
- 進行歸約,通過IP值進行Hash映射(相同IP歸到同一個reduce)
- 排序結果
2.MapReduce的運行流程
基本概念
- Job & Task
- 一個Job是一個任務(作業),每個Job可分為多個Task,Task分為MapTask和ReduceTask
- JobTracker(master管理節點)
- 作業調度(先到先服務、公平調度器)
- 分配任務、監控任務執行進度(TaskTracker需要給出狀態更新)
- 監控TaskTracker狀態(是否出現故障)
- TaskTacker
- 執行任務
- 匯報任務狀態
- 客戶端提交Job,JobTracker將其置於候選隊列
- JobTracker在適當的時候進行調度,選擇一個Job,將其拆分多個Map任務和Reduce任務,分發給TaskTracker來做
- 在實際的部署中,TaskTracker和HDFS中的DataNode是同一種物理結點(這樣可保證計算跟着數據走,讀取數據的開銷最小,移動計算代替移動數據)
- 任何Job過來都是先交到JobTracker里,采用一定調度策略分配Map任務和Reduce任務(可多輪)
- 輸入數據進行分片,按照一定規則分給TaskTracker,分配Map任務
- 任務好了之后,產生中間結果(Key-Value對)
- (Key-Value對)根據一些映射規則進行交換,再到Reduce端進行Reduce任務
- 運算完之后,數據結果寫回到HDFS中
MapReduce的容錯機制
- 重復執行(Job、硬件或者數據問題)(重復4次還是失敗以后放棄執行)
- 推測執行(某個結點算的特別慢會再找一個TaskTracker做同樣的事情,誰先算完終止另一個)(保證不會因為某一兩個TaskTracker的故障導致效率很低)