Hadoop 分佈式計算框架(MapReduce)。
MapReduce設計理念:
- 分佈式計算
- 移動計算,而不是移動數據
MapReduce計算框架
步驟1:split
split切分Block,得到很多數據片段例如圖中的split0, split1, split2。
步驟2:map
有多少個片段,就有多少個map,map是一個Java線程。
線程爲硬件和對象。
數據按照鍵值對的形式傳給map。
map執行完畢,輸出是鍵值對格式。
步驟3:shuffle
步驟4:reduce
reduce線程
reduce task
在一個MapReduce任務中,默認情況下Reduce task只有一個。
步驟5:
part
MapReduce示例
Mapper
-Map-reduce的思想就是"分而治之"
Mapper負責"分",即把複雜的任務分解爲若干個"簡單的任務"執行
- "簡單的任務"的含義:
數據或者計算規模相對於原任務要大大減小;
就近計算,即會被分配到存放了所需數據的節點進行計算
這些小任務可以並行計算,彼此間幾乎沒有依賴關係
Reducer
- 對map階段的結果進行彙總。
- Reduce的數據由mapred-site.xml配置文件裏的項目mapred.reduce.tasks決定。缺省值爲1,用戶可以覆蓋。
Shuffler
- 在mapper和reducer中間的一個步驟
- 可以把mapper的輸出按照某種key值重新切分和組合成n份,把key值符合某種範圍的輸出送到特定的reducer那裏去處理。
- 可以簡化reducer過程
默認的partion算法是,根據每一個數據中的key的hashcode / reduce數量得到分區號。
- 每個map task都有一個內存緩衝區(默認是100MB),存儲着map的輸出結果
- 當緩衝區快滿的時候需要將緩存區的數據以一個臨時文件的方式存放到磁盤
- 溢寫是單獨線程來完成,不影響往緩衝區寫map結果的線程(spill.percent,默認是0.8)
- 當溢寫線程啓動後,需要對這80MB空間內的key做排序(Sort)
– 假如client設置過Combiner,那麼現在就是使用Combiner的時候了。將有相同key的key/value對的value加起來,減少溢寫到磁盤 的數據量。(reduce1,word1,[8])。
– 當整個map task結束後再對磁盤中這個map task產生的所有臨時文件做合併(Merge),對於「word1」就是像這樣的:{「word1」, [5, 8, 2, …]},假如有Combiner,{word1 [15]},最終產生一個文件。
– reduce 從tasktracker copy數據
– copy過來的數據會先放入內存緩衝區中,這裏的緩衝區大小要比map端的更爲靈活,它基於JVM的heap size設置
– merge有三種形式:1)內存到內存 2)內存到磁盤 3)磁盤到磁盤。merge從不同tasktracker上拿到的數據,{word1 [15,17,2]}
MapReduce的Split大小
– max.split(100M)
– min.split(10M)
– block(64M)
– max(min.split,min(max.split,block))
任何一個碎片段的大小不能超過Block。
YARN
由ResourceManager、NodeManager、JobHistoryServer、Containers、Application Master、job、Task、Client組成。
ResourceManager:一個Cluster只有一個,負責資源調度、資源分配等工作。
NodeManager:運行在DataNode節點,負責啓動Application和對資源的管理。
JobHistoryServer:負責查詢job運行進度及元數據管理。
Containers:Container通過ResourceManager分配。包括容器的CPU、內存等資源。
Application Master:ResourceManager將任務給Application Master,然後Application Master再將任務給NodeManager。每個Application只有一個Application Master,運行在Node Manager節點,Application Master是由ResourceManager指派的。
job:是需要執行的一個工作單元:它包括輸入數據、MapReduce程序和配置信息。job也可以叫作Application。
task:一個具體做Mapper或Reducer的獨立的工作單元。task運行在NodeManager的Container中。
Client:一個提交給ResourceManager的一個Application程序。
二、一個job運行處理的整體流程
用戶向YARN中提交作業,其中包括Application Master啓動、Application Master的命令及用戶程序等;ResourceManager爲作業分配第一個Container,並與對應的NodeManager通信,要求它在這個Container中啓動該作業的Application Master;Application Master首先向ResourceManager註冊,這樣用戶可以直接通過ResourceManager查詢作業的運行狀態,然後它將爲各個任務申請資源並監控任務的運行狀態,直到任務結束。Application通過RPC請求想ResourceManager申請和領取資源。
然後ApplicationMaster要求指定的NodeManager節點啓動任務。
啓動之後,去幹ResoucrceManager指定的Map task。
等Map task幹完之後,通知Application Master。然後Application Master去告知Resource Manager。接下來Resource Manager分配新的資源給Application Master,讓它找人去幹其他的活。
接下來Application Master通知NodeManager啓動新的Container準備幹新的活,該活的輸入是Map task的輸出。
開始幹Reduce task任務。
等各個節點的Reduce task都幹好了,將幹活的NodeManager的任務結果進行同步。做最後的Reduce任務。
等計算完了,最後將最終的結果輸出到HDFS。
任務完成!