YRAN提供了三種調度策略
一、FIFO-先進先出調度器
YRAN默認情況下使用的是該調度器,即所有的應用程序都是按照提交的順序來執行的,這些應用程序都放在一個隊列中,只有在前面的一個任務執行完成之后,才可以執行后面的任務,依次執行
缺點:如果有某個任務執行時間較長的話,后面的任務都要處於等待狀態,這樣的話會造成資源的使用率不高;如果是多人共享集群資源的話,缺點更是明顯
二、capacity-scheduler-容量調度器
針對多用戶的調度,容量調度器采用的方法稍有不同。集群由很多的隊列組成(類似於任務池),這些隊列可能是層次結構的(因此,一個隊列可能是另一個隊列的子隊列),每個隊列被分配有一定的容量。這一點於公平調度器類似,只不過在每個隊列的內部,作業根據FIFO的方式(考慮優先級)調度。本質上,容量調度器允許用戶或組織(使用隊列自行定義)為每個用戶或組織模擬出一個使用FIFO調度策略的獨立MapReduce集群。相比之下,公平調度器(實際上也支持作業池內的FIFO調度,使其類似於容量調度器)強制池內公平共享,使運行的作業共享池內的資源。
總結:容量調度器具有以下幾個特點
1、集群按照隊列為單位划分資源,這些隊列可能是層次結構的
2、可以控制每個隊列的最低保障資源和最高使用限制,最高使用限制是為了防止該隊列占用過多的空閑資源導致其他的隊列資源緊張
3、可以針對用戶設置每個用戶的資源最高使用限制,防止該用戶濫用資源
4、在每個隊列內部的作業調度是按照FIFO的方式調度的
5、如果某個隊列的資源使用緊張,但是另一個隊列的資源比較空閑,此時可以將空閑的資源暫時借用,但是一旦被借用資源的隊列有新的任務提交之后,此時被借用出去的資源將會被釋放還回給原隊列
6、每一個隊列都有嚴格的訪問控制,只有那些被授權了的用戶才可以查看任務的運行狀態。
配置文件的說明(capacity-scheduler.xml):
<configuration> <property>
<!--集群中允許運行和排隊的最大的應用程序數量,如果如果提交的任務超過這個數量的話,那么多余的任務將不會被MR接受--> <name>yarn.scheduler.capacity.maximum-applications</name> <value>10000</value> <description> Maximum number of applications that can be pending and running. </description> </property>
<!--集群中允許運行ApplicationMater的資源百分比,控制並發運行應用程序的數量--> <property> <name>yarn.scheduler.capacity.maximum-am-resource-percent</name> <value>0.1</value> <description> Maximum percent of resources in the cluster which can be used to run application masters i.e. controls number of concurrent running applications. </description> </property>
<!--將用於比較調度程序中的資源的ResourceCalculator實現,默認是在只使用內存的時候進行資源比較--> <property> <name>yarn.scheduler.capacity.resource-calculator</name> <value>org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator</value> <description> The ResourceCalculator implementation to be used to compare Resources in the scheduler. The default i.e. DefaultResourceCalculator only uses Memory while DominantResourceCalculator uses dominant-resource to compare multi-dimensional resources such as Memory, CPU etc. </description> </property>
<!--指定root下的所有的隊列,用逗號進行分割--> <property> <name>yarn.scheduler.capacity.root.queues</name> <value>default</value> <description> The queues at the this level (root is the root queue). </description> </property>
<!--指定default下的所有隊列,依次類推-->
<property>
<name>yarn.scheduler.capacity.root.user1.queues</name>
<value>usera,userb,userc</value>
</property>
<!--指定默認default用戶使用的資源百分比,因為這里root下只有default一個用戶,所以使用了全部的資源--> <property> <name>yarn.scheduler.capacity.root.default.capacity</name> <value>100</value> <description>Default queue target capacity.</description> </property>
<!--限制default下的具體的每個用戶可以使用的最多的資源百分比,用小數表示,1說明是百分百--> <property> <name>yarn.scheduler.capacity.root.default.user-limit-factor</name> <value>1</value> <description> Default queue user limit a percentage from 0.0 to 1.0. </description> </property>
<!--限制default用戶最多可以得到集群總資源的百分比,這里只有一個用戶,所以為百分百--> <property> <name>yarn.scheduler.capacity.root.default.maximum-capacity</name> <value>100</value> <description> The maximum capacity of the default queue. </description> </property>
<!--隊列狀態:如果一個隊列的狀態是STOPPED,則不能向其提交應用程序或子隊列提交應用程序--> <property> <name>yarn.scheduler.capacity.root.default.state</name> <value>RUNNING</value> <description> The state of the default queue. State can be one of RUNNING or STOPPED. </description> </property>
<!--限定那些用戶或者是用戶組可以給給定的隊列提交應用程序--> <property> <name>yarn.scheduler.capacity.root.default.acl_submit_applications</name>
<value>*</value> <description>
The ACL of who can submit jobs to the default queue. </description> </property> <property> <name>yarn.scheduler.capacity.root.default.acl_administer_queue</name> <value>*</value> <description> The ACL of who can administer jobs on the default queue. </description> </property> <property> <name>yarn.scheduler.capacity.node-locality-delay</name> <value>40</value> <description> Number of missed scheduling opportunities after which the CapacityScheduler attempts to schedule rack-local containers. Typically this should be set to number of nodes in the cluster, By default is setting approximately number of nodes in one rack which is 40. </description> </property> </configuration>
三、Fair-scheduler-公平調度器
所謂的公平調度器指的是,旨在讓每個用戶公平的共享集群的能力。如果是只有一個作業在運行的話,就會得到集群中所有的資源。隨着提交的作業越來越多,限制的任務槽會以“讓每個用戶公平共享集群”這種方式進行分配。某個用戶的好事短的作業將在合理的時間內完成,即便另一個用戶的長時間作業正在運行而且還在運行過程中。
作業都是放在作業池中的,默認情況下,每個用戶都有自己的作業池。提交作業數較多的用戶,不會因此而獲得更多的集群資源。可以用map和reduce的任務槽數來定制作業池的最小容量,也可以設置每個池的權重。
公平調度器支持搶占機制。所以,如果一個池在特定的一段時間內未能公平的共享資源,就會終止運行池中得到過多的資源的任務,把空出來的任務槽讓給運行資源不足的作業池。
主要特點:
1、也是將集群的資源以隊列為單位進行划分,稱為隊列池
2、每個用戶都有自己的隊列池,如果該隊列池中只有一個任務的話,則該任務會使用該池中的所有資源
3、每個用戶提交作業都是提交到自己的隊列池中,所以,提交作業數較多的用戶,並不會因此而獲得更多的集群資源
4、支持搶占機制。也就是說如果一個吃在特定的時間內未能公平的共享資源,就會終止池中占用過多資源的任務,將空出來的任務槽讓給運行資源不足的作業池。
5、負載均衡:提供一個基於任務數目的負載均衡機制。該機制盡可能的將任務均勻的分配到集群的所有的節點上。