1. 程式人生 > >yarn Fairscheduler與Capacityscheduler

yarn Fairscheduler與Capacityscheduler

控制 阻塞 但是 ont timeout 允許 har bsp 獲得

Capacityscheduler

Capacityscheduler允許多個組織共享整個集群,每個組織可以獲得集群的一部分計算能力。通過為每個組織分配專門的隊列,然後再為每個隊列分配一定的集群資源,這樣整個集群就可以通過設置多個隊列的方式給多個組織提供服務了。除此之外,隊列內部又可以垂直劃分,這樣一個組織內部的多個成員就可以共享這個隊列資源了,在一個隊列內部,資源的調度是采用的是先進先出(FIFO)策略。

Capacityscheduler的特點:

1.
容量保證:可為每個隊列設置資源最低量和資源使用上限,所有提交到該隊列的應用程序共享該隊列中的資源;最小容量不是“總會保證最低容量”,可能會借給其他節點。

調度器總會選擇當前資源使用率最低的隊列,並為之分配資源。例如同級的隊列A1,A2。它們最小容量均為30%。而 A1使用了12%,A2使用了10%,則調度器會優先將資源分給A2。
2.
靈活性:如果一個隊列中的資源有剩余,可以暫時共享給那些需要資源的隊列,而一旦該隊列有新的應用程序提交,則其他隊列釋放的資源會歸還給該隊列,這種資源靈活分配的方式明顯可以提高資源的利用率;
多租戶:支持多用戶共享集群和多應用程序同時運行,為防止當個應用或者用戶或者隊列獨占集群資源,可為之增加限制,比如設置一個用戶或者應用程序可以分配的最大資源數、最大任務運行數;
3.
安全保證:每個隊列有嚴格的ACLs列表規定它的訪問用戶,每個用戶可以指定其他哪些用戶允許查看自己應用程序的運行狀態或者控制應用程序(比如kill);
4.
動態更新配置文件:管理員可以根據需要動態更改各種配置參數,以實現在線集群管理。

Fairscheduler

Fairscheduler的設計目標是為所有的應用分配公平的資源(對公平的定義可以通過參數來設置)。
舉例子:假設有兩個用戶A和B,他們分別擁有一個隊列。當A啟動一個job而B沒有任務時,A會獲得全部集群資源;當B啟動一個job後,A的job會繼續運行,不過一會兒之後兩個任務會各自獲得一半的集群資源。如果此時B再啟動第二個job並且其它job還在運行,則它將會和B的第一個job共享B這個隊列的資源,也就是B的兩個job會用四分之一的集群資源,而A的job仍然用集群一半的資源。

Fairscheduler的特點:

1.
支持資源搶占,允許調度器殺掉占用超過其應占份額資源隊列的containers,這些containers資源便可被分配到應該享有這些份額資源的隊列中。
當隊列沒有任務時,最小資源可以被其他隊列搶走;當有新的任務進來時,如果集群有資源則獲取資源,如果沒有則會從其他低優先級的隊列中搶到資源,執行任務。
搶占會降低集群的執行效率,因為被終止的containers需要被重新執行。
通過設置一個全局的參數yarn.scheduler.fair.preemption=true來啟用搶占功能。
還有兩個參數用來控制搶占的過期時間(這兩個參數默認沒有配置,需要至少配置一個來允許搶占Container):
- minimum share preemption timeout
- fair share preemption timeout
如果隊列在minimum share preemption timeout指定的時間內未獲得最小的資源保障,調度器就會搶占containers
2.
調度策略配置靈活:允許為每個隊列單獨設置調度策略(FIFO、Fair或DRF)
3.
提高小應用程序響應時間:采用最大最小公平算法,小作業可以快速獲取資源並運行完成。

三種調度策略對比 :

FIFOScheduler分配資源的順序和提交應用程序的順序相同,不適用於共享集群。大的應用可能會占用所有集群資源,這就導致其它應用被阻塞。
CapacityScheduler中,有一個專門的隊列用來運行小任務,但是為小任務專門設置一個隊列會預先占用一定的集群資源,這就導致大任務的執行時間會落後於使用FIFO調度器時的時間。
FairScheduler中,我們不需要預先占用一定的系統資源,Fair調度器會為所有運行的job動態的調整系統資源。

yarn Fairscheduler與Capacityscheduler