Yarn的资源管理机制
??? 資源調度器是Yarn的核心組件之一,它是ResourceManager中的一個組件,負責整個集群資源的管理和分配。
?
ResourceManager要處理的各種事件:
ResourceManager本質上是一個事件處理器,處理來自外部的各種SchedulerEventType類型的事件,然后對Yarn上的資源做一些調整,事件有如下幾種:
?
部分事件對應的動作如下:
?
NODE_ADDED/NODE_REMOVED:分別表示集群中增加了一個計算節點和刪除了一個計算節點,需要對可分配資源總量進行相應的增加或者減少
APPLICATION_ADDED/APPLICATION_REMOVED:ResourceManager收到一個新的Application或者一個Application運行結束(可能成功可能失敗),需要增加一個記錄該Application信息的結構或者將結構刪除
CONTAINER_EXPIRED:如果一個Container分配給某個ApplicationMaster之后再一定時間內沒有使用,那么這個Container會回收再分配
NODE_UPDATE:接受NodeManager心跳匯報的信息,有可能是新的Container釋放,此時該事件可能會觸發資源調度器最核心的資源分配機制。
?
RMAppAttempt狀態是干嘛用的?
每個Application會對應一個RMApp對象,保存該Application的各種信息。而每個RMApp可能會對應多個RMAppAttempt對象,取決與前一個RMAppAttempt對象是否成功,如果不成功則會啟動另外一個,直到運行成功
?
Yarn的雙層資源調度模型:
??? Yarn使采用的是雙層資源調度模型:第一層中,ResourceManager中的資源調度器將資源分配給各個ApplicationMaster;第二層再由各個ApplicationMaster將資源分配給內部的各個任務。Yarn實現的是第一步,第二步是由用戶應用程序自己決定的。分配過程是異步的。資源調度器給ApplicationMaster分配資源之后會先放到一個緩沖區中,等待ApplicationMaster通過周期性的心跳來主動獲取。
資源保證機制:
在分布式計算中,資源調度器需要選擇合適的資源保證機制,當應用程序申請的資源暫時無法保證時:
1.優先為應用程序預留一個節點上的資源直到累計釋放的空閑資源滿足應用程序需求(稱為“增量資源分配”)
2.暫時放棄當前資源直到出現一個節點剩余資源一次性滿足應用程序需求(稱為“一次性資源分配”)
這兩種機制均存在優缺點,對于增量資源分配來說,資源預留會導致資源浪費,降低集群資源利用率;而一次性資源分配則會產生餓死現象,即應用程序可能永遠等不到滿足資源需求的節點出現,YARN采用了增量資源分配機制 ,盡管這種機制會造成浪費,但不會出現餓死現象;
?
Yarn的資源調度器
Yarn的資源調度器是可配置的,Yarn定義了一套接口規范(接口ResourceScheduler),用戶可以按照自己的需求實現這個接口中的方法。Yarn自身自帶了三種調度器,分別是:FIFO Scheduler、Capacity Scheduler(Yahoo!)和Fair Scheduler(Facebook)。
FIFO Scheduler:
最初Hadoop使用的就是FIFO這種非常簡單的任務調度機制,所有的作業都被統一提交到一個隊列中,優先給隊列中的第一個任務分配資源,第一個任務資源滿足后再給下一個分配,以此類推。
??? 優點是簡單可靠,也不需要任何配置。缺點也很明顯,如果上一個作業一下子就把資源全部占光的話,那么下一個作業就需要等到上一個作業完成才能運行,這樣不能充分利用硬件資源且不能滿足多樣化的需求。
??? 所以FOFO Scheduler不適用于共享集群,共享集群更適合采用Capacity Scheduler或Fair Scheduler,這兩個調度器都允許大任務和小任務在提交的同時獲得一定的系統資源。
?
Capacity Scheduler:
設計思想是資源按比例分配給各個隊列。這些隊列是用戶通過配置文件配置的。隊列里的資源如果空閑的話,會被其他隊列中的任務暫時占用(所以那個“隊列最小容量”的配置不一定生效)。
每個隊列都會設置一個最大資源占比,這樣可以保證每個隊列不用占用整個集群的資源。默認是不設置的,這樣隊列有可能使用100%的資源,當其他隊列有應用程序提交時,再逐步歸還。
每個用戶也可以設定一定的資源上限,防止資源濫用。
隊列內部是以FIFO方式調度的。正常情況下,Capacity Scheduler不會強行通過強行終止來強占容器。意思就是說,隨著任務的增多,資源不夠用時并且隊列中的資源被其他隊列給強占了,它只能等待其他隊列釋放資源。一般可以通過設置其他隊列的最大容量來環節這種情況,這個就是需要權衡的地方。
?
Fair Scheduler:
設計思想是所有的應用分配公平的資源。公平是通過隊列配置的權重(weight)來作為公平調度的依據,如果沒有配置權重,那么所有隊列的權重都為1,所有隊列公平分配集群資源。
它也是以隊列為單位劃分資源,每個隊列可以設置一定比例的資源最低保證和使用上限,同時每個用戶也可設定一定的資源使用上限以防止資源濫用,當一個隊列有資源剩余的時候可以共享給其他隊列…和Capacity Scheduler基本一致
??? 從圖上可以看出,它不需要預留資源,因為調度器會在運行的作業之間動態平衡資源:第一個作業(用戶A)啟動時,由于是唯一運行的任務,所以它獨占全部資源.當第二個作業(用戶B)啟動時,它會分配到一半資源.當然,第二個作業從啟動到獲得公平共享資源的時間會有滯后,因為必須等待第一個任務的容器用完并釋放出資源,當第二個作業完成后,第一個作業會再次獨占全部資源.
??? 不同的是Fair Scheduler實現了更多樣化的調度策略,它允許每個隊列單獨配置調度策略(schedulingPolicy),分別有:FIFO/Fair/DRF,默認使用的是Fair。而且Fair Scheduler實現了搶占功能,允許調度器Kill掉超過其應占份額資源隊列的Containers(公平的定義),需要注意搶占會降低集群的執行效率,因為被終止的containers需要被重新執行。
??? 默認情況下,Fair調度器只是對內存資源做公平的調度和分配,也可以配置成基于內存+Cpu。
?
總結:
如果業務邏輯比較簡單或者剛接觸Hadoop的時候建議使用FIFO調度器;如果需要控制部分應用的優先級同時又想要充分利用集群資源的情況下,建議使用Capacity調度器;如果想要多用戶或者多隊列公平的共享集群資源,那么就選用Fair調度器。
??? 具體的源碼層面細節的分析后面看完了再補充吧。
?
?
?
參考:
??? https://www.jianshu.com/p/2c100d4f5349?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation(三種Scheduler示意圖)
??? https://blog.csdn.net/zhanyuanlin/article/details/78799341(Yarn資源預留機制引起的問題)
總結
以上是生活随笔為你收集整理的Yarn的资源管理机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual Studio 2008下载
- 下一篇: VoIP技术(2)--语音编码算法-1