Map
任務
splitting and sharding data
Map
任務相互獨立Map
傳輸到Reduce
key
的Map
輸出會分配給同一個Reduce
任務partition
函數,好比hash(key) % number_of_reducers
Reduce
任務
Reduce
任務相互獨立Map Input
: 來自分佈式文件系統Map Output
: Map
節點的本地磁盤(本地文件系統)Reduce Input
: 遠程磁盤(本地文件系統)Reduce Output
: 分佈式文件系統理論上,Reduce
階段只能在全部Map
階段結束以後啓動(未結束的Map
任務可能產生新的key/value
對,對應該key
的Reduce
任務須要等待Map
完成)。這種兩個階段之間的隔離操做叫作barrier
。node
事實上部分Reduce
任務是能夠提前開始的。MapReduce
中也是這樣實現的。可是這種操做不利於咱們理解MapReduce
範式,因此咱們先忽略這件事。服務器
Barrier
不成立的緣由之一,是在Map
階段和Reduce
階段之間存在Shuffle
階段。Shuffle
能夠和Map
並行執行。app
PS.推薦兩篇文章《MapReduce:詳解Shuffle過程》《MapReduce的shuffle過程詳解(分片、分區、合併、歸併)》,對這段shuffle的梳理實在是妙。大體解釋一下:
Map任務的結果不會馬上寫入磁盤,而是寫到一個叫環形內存緩衝區的地方(這個操做叫spill
)。spill
的時候,會根據key進行分區(partition)
。緩衝區默認最大是100M
,當寫入達到閾值(默認是80%
)的時候,會啓動一個線程將緩衝區文件寫到磁盤臨時文件。而這個線程會執行一個排序(sort)
和一個合併(combine)
操做。整個spill執行完以後,會對全部臨時文件進行歸併(merge)
。merge
時會繼續進行sort
和combine
來減小最終輸出大小。
上面這段流程就是map
端的shuffle
操做,裏面的combine
是可選的,部分狀況下其實執行的是reduce
。分佈式
因此,spill
時首先進行partition
,而後partition
內sort
、combine
,最後寫出到磁盤。而combine
能夠是reduce
,因此Map
和Reduce
之間不存在Barrier
。函數
YARN = Yet Another Resource Negotiator
. YARN
是從Hadoop 2.x
開始引入的資源調度器。oop
YARN
將每一個服務器當作一組容器(container)
。Container = some CPU + some memory
。每一個容器能夠執行一個任務.net
若是服務器有4個CPU和4GB內存,而每一個容器中有一個CPU和1GB的RAM。那麼這個服務器有4個容器,能夠運行四個任務。線程
YARN有三個主要部分:code
Resource Manager
資源管理器 RM
Resource Manager
是全局進程Node Manager
節點管理器 NM
Node Manager
在每一個server
都有一個Application Master
應用管理AM
per-application(job)
container
與Resource Manager
、Node Manager
之間協商通訊Node Manager
通訊,檢測任務掛起和從新調度YARN
分配container
兩臺服務器A、B:每一個服務器有一個Node Manager
在運行
兩個任務一、2:每一個任務有一個Application Master
全局有一個Resource Manager
在運行
cdn
Timeline:
sequence | environment | action |
---|---|---|
0 | 開始時,Job2(App2) 剛剛運行結束,Job1(App1) 即將啓動 |
N/A |
1 | Job1(App1) 即將啓動 |
Application Master1(AM_1) 通知Resource Manager(RM) <App1 即將啓動,須要分配一個container > |
2 | RM 收到AM_1 的消息,但無可分配的container |
RM 將AM_1 消息放入隊列掛起,隨後Node Manager B(NM_B) 向RM 發送消息 <container 空閒> |
3 | RM 收到NM_2 的消息 |
RM 通知AM_1 , node B 有空閒container |
4 | AM_1 收到RM 消息 |
AM_1 通知NM_B 執行Job1 |
實際運行中,每一個任務會申請多個container,Resource Manager會根據申請的順序分配container