概述
集羣資源是很是有限的,在多用戶、多任務環境下,須要有一個協調者,來保證在有限資源或業務約束下有序調度任務,YARN資源調度器就是這個協調者。算法
YARN調度器有多種實現,自帶的調度器爲Capacity Scheduler和Fair Scheduler。YARN資源調度器均實現Resource Scheduler接口,是一個插拔式組件,用戶能夠經過配置參數來使用不一樣的調度器,也能夠本身按照接口規範編寫新的資源調度器。默認狀況下,YARN採用的是Capacity Scheduler調度器。安全
Capacity Scheduler
Capacity Scheduler簡介
Capacity Scheduler(計算能力調度器)是由Yahoo貢獻的,主要是解決HADOOP-3421中提出的,在調度器上完成HOD(Hadoop On Demand)功能,克服已有HOD的性能低效的缺點。它適合於多用戶共享集羣的環境的調度器。在多用戶的狀況下,達到最大化集羣的吞吐和利用率的目的。markdown
Capacity 調度器容許多個組織共享整個集羣,每一個組織能夠得到集羣的一部分計算能力。經過爲每一個組織分配專門的隊列,而後再爲每一個隊列分配必定的集羣資源,這樣整個集羣就能夠經過設置多個隊列的方式給多個組織提供服務了。除此以外,隊列內部又能夠垂直劃分,這樣一個組織內部的多個成員就能夠共享這個隊列資源了,在一個隊列內部,資源的調度是採用的是先進先出(FIFO)策略。oop
一個job可能使用不了整個隊列的資源。然而若是這個隊列中運行多個job,若是這個隊列的資源夠用,那麼就分配給這些job,若是這個隊列的資源不夠用了呢?其實Capacity調度器仍可能分配額外的資源給這個隊列,這就是彈性隊列(queue elasticity)的概念。post
在正常的操做中,Capacity調度器不會強制釋放Container,當一個隊列資源不夠用時,這個隊列只能得到其它隊列釋放後的Container資源。固然,咱們能夠爲隊列設置一個最大資源使用量,以避免這個隊列過多的佔用空閒資源,致使其它隊列沒法使用這些空閒資源,這就是彈性隊列須要權衡的地方。性能
Capacity Scheduler特色
- 容量保證:每一個隊列都分配了一部分容量,他們能夠支配着部分資源。提交到特定隊列的應用程序,可使用該隊列的資源。管理員能夠配置每一個隊列容量的最低保證和資源使用上限。
- 安全性:每一個隊列都有嚴格的ACL(控制訪問列表),它能夠控制用戶提交應用程序到特定隊列上。同時保證用戶不能查看或修改其它用戶提交的應用程序,而且隊列管理員和集羣系統管理員能夠對其進行維護。
- 靈活性:隊列的空閒資源能夠分配各其它隊列使用。若是某隊列的資源分配未達到隊列資源使用上限,在其須要更多資源時,將分配其它隊列的空閒資源給該繁忙隊列。
- 多用戶性:支持多用戶共享集羣,一些列的綜合設置能夠防止單個應用程序、用戶或隊列獨佔隊裏或集羣的所有資源。
- 可操做性:支持運行時配置和隊列中止。隊列的屬性(例如:資源容量分配、ACL等)能夠在運行時由管理員以一種安全的方式更改,從而減小了對用戶的影響。同時提供給管理員和用戶一個界面,用於查看當前隊列資源的使用狀況。管理員能夠在集羣運行時添加新隊列,能夠在中止運行的隊列的同時保證隊列上的任務運行完成,而新的任務不能提交到該隊列上。注意如今不支持在運行時刪除隊列,若是須要刪除隊列,須要重啓集羣。
- 層級隊列:層級隊列可確保資源在該組織的子隊列之間被共享,從而提供更多的可控制性和預測性。
- 基於資源的調度:支持資源密集型的應用程序,容許應用程序使用的資源量高於默認值,從而該調度器能夠支持不一樣資源需求的應用程序。目前只支持內存資源的配置,經過配置可支持CPU資源。
Fair Scheduler
Fair Scheduler是由Facebook貢獻的,是Hadoop上一個可插拔式的調度器,容許YARN應用程序在一個大的集羣上公平地共享資源。3d
公平調度是一種爲應用程序分配資源的方法,多用戶的狀況下,強調用戶公平地使用資源。默認狀況下Fair Scheduler根據內存資源對應用程序進行公平調度,經過配置能夠修改成根據內存和CPU兩種資源進行調度。當集羣中只有一個應用程序運行時,那麼此應用程序佔用這個集羣資源。當其餘的應用程序提交後,那些釋放的資源將會被分配給新的應用程序,因此每一個應用程序最終都能獲取幾乎同樣多的資源。blog
在Fair Scheduler中,不須要預先佔用必定的系統資源,Fair Scheduler會動態調整應用程序的資源分配。例如,當第一個大job提交時,只有這一個job在運行,此時它得到了全部集羣資源;當第二個小任務提交後,Fair調度器會分配一半資源給這個小任務,讓這兩個任務公平的共享集羣資源。排序
須要注意的是,在下圖Fair Scheduler中,從第二個任務提交到得到資源會有必定的延遲,由於它須要等待第一個任務釋放佔用的Container。小任務執行完成以後也會釋放本身佔用的資源,大任務又得到了所有的系統資源。接口
Fair Scheduler將應用程序支持以隊列的方式組織,這些隊列之間公平的共享資源。默認,全部的用戶共享一個隊列。若是應用程序在請求資源時指定了隊列,那麼請求將會被提交到指定的隊列中。也能夠經過配置,根據用戶名稱來分配隊列。在每一個隊列內部,應用程序基於內存公平共享或FIFO共享資源。
舉個例子,假設有兩個用戶A和B,他們分別擁有一個隊列。當A啓動一個job而B沒有任務時,A會得到所有集羣資源;當B啓動一個job後,A的job會繼續運行,不過一下子以後兩個任務會各自得到一半的集羣資源。若是此時B再啓動第二個job而且其它job還在運行,則它將會和B的第一個job共享B這個隊列的資源,也就是B的兩個job會用於四分之一的集羣資源,而A的job仍然用於集羣一半的資源,結果就是資源最終在兩個用戶之間平等的共享。過程以下圖所示:
Fair Scheduler容許爲隊列分配擔最小的共享資源量,這樣能夠保證某些用戶、groups或者應用程序總能獲取充足的資源。當一個隊列中有正在運行的應用程序時,它至少可以獲取設置的最小資源,當隊列中無任務時,它的資源將會被拆分給其餘運行中的任務。
Fair Scheudler在默認狀況下容許全部的任務運行,可是這也能夠經過配置文件來限制每一個用戶下和每一個隊列下運行的任務個數。處於限制時,新提交的任務不會提交失敗,而是在Scheduler queue中等待,直到先前的任務結束,再執行。
Fair Scheduler vs Capacity Scheduler
- 相同點
- 都支持多用戶多隊列,即:適用於多用戶共享集羣的應用環境
- 都支持層級隊列
- 支持配置動態修改,更好的保證了集羣的穩定運行。
- 均支持資源共享,即某個隊列中的資源有剩餘時,可共享給其餘缺資源的隊列
- 單個隊列均支持優先級和FIFO調度方式
- 不一樣點
Capacity Scheduler與Fair Scheduler最大的區別爲調度策略的不一樣- Capacity Scheduler的調度策略是,能夠先選擇資源利用率低的隊列,而後在隊列中經過FIFO或DRF進行調度。
- Fair Scheduler的調度策略是,可使用公平排序算法選擇隊列,而後再隊列中經過Fair(默認)、FIFO或DRF的方式進行調度。