Yarn組件簡介

Yarn基礎介紹

Ps:在博文開始前,需要說明的是該篇文章有部分的內容和圖片摘自網上一些博主的博客,若有冒犯請知會我刪除該部分內容,也感謝這些博主的博客給我在學習yarn組件時給予的莫大幫助。

一、Yarn的發展史

1) MRv1

引入JobTracker、TaskTracker的概念:
A:JobTracker:一個管理者,接受來自TaskTracker的心跳,負責資源管理和job的調度。
B:TaskTracker:像是一箇中層的管理者,接受來自JobTracker的請求,也會反饋來自任務的實現情況。

從圖中可看到,MRv1實現了一個相對簡單的集羣管理器來執行MapReduce處理,但是這種架構存在着不足,查閱資料得到,當節點數量大於4000時,就會具有較大的不可預測性以及風險使得JobTracker掛掉,那麼就會導致整個集羣癱瘓。爲了解決這樣的問題,就產生了Yarn。


2) MRv2 -- Yarn

爲了解決這樣的問題,將JobTracker中的資源管理和作業控制功能分開,分別由組件ResourceManager 和ApplicationMaster實現,其中,ResourceManager負責所有應用程序的資源分配,而ApplicationMaster僅負責管理一個應用程序,進而誕生了全新的通用資源管理框架Yarn。 


二、 Yarn的結構以及工作機制

 在看下圖之前,我們先熟悉幾個概念:

1) ResourceManager 

控制整個集羣並管理應用程序向基礎計算資源的分配,將各個資源部分(計算、內存、帶寬等)精心安排給基礎NodeManager(Yarn的每個節點)。它主要由兩個組件構成:調度器(scheduler)和應用管理器。(Applications Manager),其中調度器(可插拔,後文再做補充)僅根據各個應用程序的資源需求進行資源分配,剩餘的交給ASM來做,如監控跟蹤應用程序執行狀態等。它的一些功能:

A:處理客戶端請求

B:啓動或監控ApplicationMaster

C:監控NodeManager

D:資源的分配與調度。

2) ApplicationMaster

管理一個在Yarn內運行的應用程序的每個實例。負責協調來自ResourceManager的資源,並通過NodeManager監視容器的執行和資源使用(CPU、內存的資源分配)。它的一些功能:

A:負責數據的切分
B:爲應用程序申請資源並分配給內部的任務
C:任務的監控與容錯

3) NodeManager

A:管理yarn中每一個節點,從監督對一個容器的終生管理到監視資源和跟蹤節點健康

B:管理單個節點的資源

C:處理來自ResourceManager的命令

D:處理來自NodeManager的命令

4) Container

A:是Yarn中的資源抽象,可信息以理解爲該任務所佔用的資源

B:對任務運行環境進行抽象,封裝CPU、內存等多維度的資源以及環境變量、啓動命令等任務運行相關的

5) Yarn的工作原理

A. 用戶向Yarn提交任務,其中包括ApplicationMaster程序,ResourceManager就會爲這個任務申請一個Container,並交給對應的NodeManager管理,保證這個任務在這個Container中啓動。
B. 而後ApplicationMaster可以以輪詢的方式通過RPC協議向ResourceManager註冊,申請需求的資源,使得用戶可以通過ResourcrManager去監控它,直到任務結束。
C. ApplicationMaster申請到資源後,就會與對應的NodeManager通信,要求它啓動任務,NodeManager就會爲任務設置好任務運行環境,將任務寫到一個腳本中,並啓動它。
D. 各個任務都會通過RPC協議向ApplicationMaster回報自己的狀態和進度,使得ApplicationMaster可以掌握各個任務的狀態,從而可以在任務失敗的時候重新啓動任務,用戶也可以隨時通過RPC去查詢應用程序的狀態。
E. 最後任務結束,ApplicationMaster會向ResourceManager註銷自己。

三、 淺談Yarn資源調度與資源隔離

1)內存

當談到資源時,通常指的是CPU、內存、IO三種,正常情況下,Yarn不會對任何資源進行隔離,當然,如果採用java語言編寫的程序,則會使用JVM內置的隔離機制爲內存資源進行隔離。對於Yarn而言,目前所做的工作就是監控每一個任務的進程樹,如果每個任務的進程樹使用的總物理內存或者總虛擬內存量超過了預先設置值,則依次發送TERM和KILL兩個信號將整個進程樹殺死。如果你在YARN上運行了一些特殊的任務或者服務,可使用Cgroups對內存進行嚴格的隔離。


2)CPU

目前Yarn對於CPU資源隔離的支持並不是很好,在此就簡單介紹一下。CPU資源按照百分比進行使用和隔離,是通過Cgroups中cpu.shares參數來實現的,這個方式能夠保證每個節點上的cpu資源得到充分的共享和使用,從而產生較高的CPU利用率,但是要啓動這個功能,還需經過複雜的參數配置和調整。限制每個container的CPU資源使用上限。但是該功能僅有可使用的補丁,還沒合到hadoop的主幹中。如果是異構集羣,某些節點上的CPU擁有更強的計算能力,則調整物理CPU和虛擬CPU的比例。虛擬CPU的概念是借鑑內存和虛擬內存的,主要目的是消除集羣中cpu計算能力的異構性


3)I/O

IO資源分爲磁盤IO和網絡IO兩種。目前YARN已經在這兩方面展開工作,初步的設計文檔已經發布。IO資源的隔離比CPU和內存複雜的多,爲了便於用戶量化IO資源,YARN仿照“虛擬cpu”的概念,引入了“虛擬磁盤”(vdisk),第一階段將嘗試使用cgroup的blkio模塊實現磁盤IO隔離。當然,在實現該功能之前,還需要將IO資源加入調度器管理的範疇,使得hadoop中的資源調度器,比如公平調度器或者容量調度器,可以對磁盤IO和網絡IO進行調度。


四、資源計算


在Spark中,有Yarn-Client和Yarn-Cluster兩種模式可以運行在Yarn上,通常Yarn-cluster適用於生產環境,而Yarn-Client更適用於環境測試使用,在spark on yarn模式下,每一個spark executor都會作爲一個container運行,接下來我們介紹一下資源計算的公式:
\bg_black TotalMemory={\color{Red} (AmMemory + AmMemoryOverhead)} + {\color{Magenta} (ExecutorMemory+ExecutorMemoryOverhead) * NumExectuors}
AmMemory :spark-submit申請的AM內存spark.yarn.am.memory,默認是512M
AmMemoryOverhead:spark.yarn.am.memoryOverhead,默認是max(spark.yarn.am.memory * 0.10, 384M)
(AmMemory + AmMemoryOverhead) ,這裏計算的是供給AM的Container內存資源
(ExecutorMemory + ExecutorMemoryOverhead),這裏則是一個executor所需的Container大小


Ps:值得一提的是在我們的yarn中,有一個資源規整化因子,在fair調度器模式下規整化因子可配置,在capatity和FIFO調度器下就等於我們最小可申請的內存/CPU。我會在下面的腳本代碼中作爲栗子介紹給大家。


4.1 yarn-client

driver運行在本地客戶端上,從上面公式可以看到,資源的申請總共分兩塊,一塊是AM所需的資源申請,另一則是executor的資源申請

/bigdata/salut/components/spark/bin/spark-submit \
 --master yarn \
 --deploy-mode client \
 --class com.TestDemo \
 --name "TestDemo " \
 --queue root.default\
 --driver-memory 3g \
 --num-executors 1  \
 --executor-memory 6g \
 --executor-cores 4 \
 --conf spark.yarn.am.memory=1g \
 --conf spark.yarn.am.memoryOverhead=1g \
 --conf spark.yarn.executor.memoryOverhead=2g \

4.2 yarn-cluster

driver運行在隨機的一個NM上,只不過在cluster模式中,AmMemory=driver-memory。

/bigdata/salut/components/spark/bin/spark-submit \
 --master yarn-cluster \
 --class com.TestDemo \
 --name "TestDemo" \
--queue root.default \
 --driver-memory 2g \
 --num-executors 1 \
 --executor-memory 12g \
 --executor-cores 5 \
 /bigdata/salut/lib/public/salut-spark-1.2.jar $*

五、 Schedule介紹


1)fair shcedule的特點

A:支持多用戶多隊列
B:資源公平共享

C:支持搶佔

D:限製作業併發量

2)capatity schedule特點

A:能夠設置隊列,並且針對每一個隊列可以設置資源使用的上下限,以及是否可以搶佔別的隊列的資源
B:安全,每個隊列可以設置嚴格的訪問控制

C:支持隊列資源,用戶管理的動態調整

D:更加細粒度的資源調度

E:支持優先級調度功能,默認不支持可以在配置文件中配置

六、小結

本篇文章僅是對Yarn組件做了一個比較基礎的介紹,蛋撻在後面的文章中會陸續介紹Yarn組件資源調度的原理。

最後還是要由衷感謝在蛋撻學習Yarn組件的過程中,網絡上各位博主的文章對蛋撻給予的莫大幫助!


作者:蛋撻

日期:2018.7.30

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章