叢集資源是非常有限的,在多使用者、多任務環境下,需要有一個協調者,來保證在有限資源或業務限制下有序排程任務,YARN資源排程器就是這個協調者。
YARN排程器有多種實作,自帶的排程器為Capacity Scheduler和Fair Scheduler。YARN資源排程器均實作Resource Scheduler接口,是一個插拔式元件,使用者可以通過配置參數來使用不同的排程器,也可以自己按照接口規範編寫新的資源排程器。預設情況下,YARN采用的是Capacity Scheduler排程器。
Capacity Scheduler(計算能力排程器)是由Yahoo貢獻的,主要是解決HADOOP-3421中提出的,在排程器上完成HOD(Hadoop On Demand)功能,克服已有HOD的性能低效的缺點。它适合于多使用者共享叢集的環境的排程器。在多使用者的情況下,達到最大化叢集的吞吐和使用率的目的。
Capacity 排程器允許多個組織共享整個叢集,每個組織可以獲得叢集的一部分計算能力。通過為每個組織配置設定專門的隊列,然後再為每個隊列配置設定一定的叢集資源,這樣整個叢集就可以通過設定多個隊列的方式給多個組織提供服務了。除此之外,隊列内部又可以垂直劃分,這樣一個組織内部的多個成員就可以共享這個隊列資源了,在一個隊列内部,資源的排程是采用的是先進先出(FIFO)政策。
一個job可能使用不了整個隊列的資源。然而如果這個隊列中運作多個job,如果這個隊列的資源夠用,那麼就配置設定給這些job,如果這個隊列的資源不夠用了呢?其實Capacity排程器仍可能配置設定額外的資源給這個隊列,這就是彈性隊列(queue elasticity)的概念。
在正常的操作中,Capacity排程器不會強制釋放Container,當一個隊列資源不夠用時,這個隊列隻能獲得其它隊列釋放後的Container資源。當然,我們可以為隊列設定一個最大資源使用量,以免這個隊列過多的占用空閑資源,導緻其它隊列無法使用這些空閑資源,這就是彈性隊列需要權衡的地方。
容量保證:每個隊列都配置設定了一部分容量,他們可以支配着部分資源。送出到特定隊列的應用程式,可以使用該隊列的資源。管理者可以配置每個隊列容量的最低保證和資源使用上限。
安全性:每個隊列都有嚴格的ACL(控制通路清單),它可以控制使用者送出應用程式到特定隊列上。同時保證使用者不能檢視或修改其它使用者送出的應用程式,并且隊列管理者和叢集系統管理者可以對其進行維護。
靈活性:隊列的空閑資源可以配置設定各其它隊列使用。如果某隊列的資源配置設定未達到隊列資源使用上限,在其需要更多資源時,将配置設定其它隊列的空閑資源給該繁忙隊列。
多使用者性:支援多使用者共享叢集,一些列的綜合設定可以防止單個應用程式、使用者或隊列獨占隊裡或叢集的全部資源。
可操作性:支援運作時配置和隊列停止。隊列的屬性(例如:資源容量配置設定、ACL等)可以在運作時由管理者以一種安全的方式更改,進而減少了對使用者的影響。同時提供給管理者和使用者一個界面,用于檢視目前隊列資源的使用情況。管理者可以在叢集運作時添加新隊列,可以在停止運作的隊列的同時保證隊列上的任務運作完成,而新的任務不能送出到該隊列上。注意現在不支援在運作時删除隊列,如果需要删除隊列,需要重新開機叢集。
層級隊列:層級隊列可確定資源在該組織的子隊列之間被共享,進而提供更多的可控制性和預測性。
基于資源的排程:支援資源密集型的應用程式,允許應用程式使用的資源量高于預設值,進而該排程器可以支援不同資源需求的應用程式。目前隻支援記憶體資源的配置,通過配置可支援CPU資源。
Fair Scheduler是由Facebook貢獻的,是Hadoop上一個可插拔式的排程器,允許YARN應用程式在一個大的叢集上公平地共享資源。
公平排程是一種為應用程式配置設定資源的方法,多使用者的情況下,強調使用者公平地使用資源。預設情況下Fair Scheduler根據記憶體資源對應用程式進行公平排程,通過配置可以修改為根據記憶體和CPU兩種資源進行排程。當叢集中隻有一個應用程式運作時,那麼此應用程式占用這個叢集資源。當其他的應用程式送出後,那些釋放的資源将會被配置設定給新的應用程式,是以每個應用程式最終都能擷取幾乎一樣多的資源。
在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中等待,直到先前的任務結束,再執行。
相同點
都支援多使用者多隊列,即:适用于多使用者共享叢集的應用環境
都支援層級隊列
支援配置動态修改,更好的保證了叢集的穩定運作。
均支援資源共享,即某個隊列中的資源有剩餘時,可共享給其他缺資源的隊列
單個隊列均支援優先級和FIFO排程方式
不同點
Capacity Scheduler與Fair Scheduler最大的差別為排程政策的不同
Capacity Scheduler的排程政策是,可以先選擇資源使用率低的隊列,然後在隊列中通過FIFO或DRF進行排程。
Fair Scheduler的排程政策是,可以使用公平排序算法選擇隊列,然後再隊列中通過Fair(預設)、FIFO或DRF的方式進行排程。
本文轉自 張沖andy 部落格園部落格,原文連結:http://www.cnblogs.com/andy6/p/8417809.html ,如需轉載請自行聯系原作者