版權聲明:本套技術專欄是做者(秦凱新)平時工做的總結和昇華,經過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和集羣環境容量規劃等內容,請持續關注本套博客。QQ郵箱地址:1120746959@qq.com,若有任何技術交流,可隨時聯繫。html
不夠用時最多搶佔其餘隊列的應用只有一個 node
Fair調度器的設計目標是爲全部的應用分配公平的資源(對公平的定義能夠經過參數來設置)。在上面的「Yarn調度器對比圖」展現了一個隊列中兩個應用的公平調度;固然,公平調度在也能夠在多個隊列間工做。舉個例子,假設有兩個用戶A和B,他們分別擁有一個隊列。當A啓動一個job而B沒有任務時,A會得到所有集羣資源;當B啓動一個job後,A的job會繼續運行,不過一下子以後兩個任務會各自得到一半的集羣資源。若是此時B再啓動第二個job而且其它job還在運行,則它將會和B的第一個job共享B這個隊列的資源,也就是B的兩個job會用於四分之一的集羣資源,而A的job仍然用於集羣一半的資源,結果就是資源最終在兩個用戶之間平等的共享。shell
Fair Scheduler容許用戶將隊列信息專門放到一個配置文件(默認是fair-scheduler.xml),對於每一個隊列,管理員可配置如下express
以最大資源申請1 apache
以最大資源申請2(原先任務不會作資源釋放)app
幾個選項:less
(1) minResources :最少資源保證量,設置格式爲「X mb, Y vcores」,當一個隊列的最少資源保證量未知足時,它將優先於其餘同級隊列得到資源,對於不一樣的調度策略,最少資源保證量的含義不一樣,對於fair策略,則只考慮內存資源,即若是一個隊列使用的內存資源超過了它的最少資源量,則認爲它已獲得了知足;對於drf策略,則考慮主資源使用的資源量,即若是一個隊列的主資源量超過它的最少資源量,則認爲它已獲得了知足。
(2) maxResources:最多可使用的資源量,fair scheduler會保證每一個隊列使用的資源量不會超過該隊列的最多可以使用資源量。
(3) maxRunningApps:最多同時運行的應用程序數目。經過限制該數目,可防止超量Map Task同時運行時產生的中間輸出結果撐爆磁盤。
(4) minSharePreemptionTimeout:最小共享量搶佔時間。若是一個資源池在該時間內使用的資源量一直低於最小資源量,則開始搶佔資源。
(5) schedulingMode/schedulingPolicy:隊列採用的調度模式,能夠是fifo、fair或者drf。
(6) aclSubmitApps:可向隊列中提交應用程序的Linux用戶或用戶組列表,默認狀況下爲「*」,表示任何用戶都可以向該隊列提交應用程序。須要注意的是,該屬性具備繼承性,即子隊列的列表會繼承父隊列的列表。配置該屬性時,用戶之間或用戶組之間用「,」分割,用戶和用戶組之間用空格分割,好比「user1, user2 group1,group2」。
(7) aclAdministerApps:該隊列的管理員列表。一個隊列的管理員可管理該隊列中的資源和應用程序,好比可殺死任意應用程序。管理員也可爲單個用戶添加maxRunningJobs屬性限制其最多同時運行的應用程序數目。此外,管理員也可經過如下參數設置以上屬性的默認值:
(8) userMaxJobsDefault:用戶的maxRunningJobs屬性的默認值。
(9) defaultMinSharePreemptionTimeout :隊列的minSharePreemptionTimeout屬性的默認值。
(10) defaultPoolSchedulingMode:隊列的schedulingMode屬性的默認值。
(11) fairSharePreemptionTimeout:公平共享量搶佔時間。若是一個資源池在該時間內使用資源量一直低於公平共享量的一半,則開始搶佔資源。
複製代碼
<?xml version="1.0"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>
<property>
<name>yarn.scheduler.fair.allocation.file</name>
<value>/usr/local/soft/cdh_support/hadoop-2.6.0-cdh5.9.3/etc/hadoop/fair-scheduler.xml</value>
</property>
<property>
<name>yarn.scheduler.fair.preemption</name>
<value>true</value>
</property>
<property>
<name>yarn.scheduler.fair.user-as-default-queue</name>
<value>false</value>
<description>default is True</description>
</property>
<property>
<name>yarn.scheduler.fair.allow-undeclared-pools</name>
<value>false</value>
<description>default is True</description>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.shuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>Master:8025</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>Master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>Master:8050</value>
</property>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>30720</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>30</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>10</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>30</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>1</value>
</property>
<property>
   <name>hadoop.proxyuser.admin.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.admin.groups</name>
    <value>*</value>
</property>
</configuration>
複製代碼
總資源爲60G內存,60個核數oop
<?xml version="1.0"?>
<allocations>
<queue name="root">
<minResources>1024mb,2vcores</minResources>
<maxResources>30920mb,30vcores</maxResources>
<maxRunningApps>50</maxRunningApps>
<weight>2.0</weight>
<schedulingMode>fair</schedulingMode>
<aclSubmitApps> </aclSubmitApps>
<aclAdministerApps> </aclAdministerApps>
<queue name="queue1">
<minResources>1024mb,2vcores</minResources>
<maxResources>10240mb,10vcores</maxResources>
<maxRunningApps>50</maxRunningApps>
<weight>2.0</weight>
<schedulingMode>fair</schedulingMode>
<aclAdministerApps>admin</aclAdministerApps>
<aclSubmitApps>admin</aclSubmitApps>
</queue>
<queue name="queue2">
<minResources>1024mb,2vcores</minResources>
<maxResources>20480mb,20vcores</maxResources>
<maxRunningApps>50</maxRunningApps>
<weight>2.0</weight>
<schedulingMode>fair</schedulingMode>
<aclAdministerApps>admin</aclAdministerApps>
<aclSubmitApps>admin</aclSubmitApps>
</queue>
</queue>
</allocations>
複製代碼
資源申請(默認超出隊列的任務只能有一個能夠向外隊列去借用資源)測試
spark-shell --master yarn --executor-memory 1024m --num-executors 4 --executor-cores 1 --queue queue2
spark-shell --master yarn --executor-memory 1024m --num-executors 4 --executor-cores 1 --queue queue2
spark-shell --master yarn --executor-memory 1024m --num-executors 3 --executor-cores 4 --queue queue2
spark-shell --master yarn --executor-memory 1024m --num-executors 3 --executor-cores 4 --queue queue2
複製代碼
資源申請一覽ui
經過上面那幅圖,咱們已經知道一個job可能使用不了整個隊列的資源。然而若是這個隊列中運行多個job,若是這個隊列的資源夠用,那麼就分配給這些job,若是這個隊列的資源不夠用了呢?其實Capacity調度器仍可能分配額外的資源給這個隊列,這就是「彈性隊列」(queue elasticity)的概念。
在正常的操做中,Capacity調度器不會強制釋放Container,當一個隊列資源不夠用時,這個隊列只能得到其它隊列釋放後的Container資源。固然,咱們能夠爲隊列設置一個最大資源使用量,以避免這個隊列過多的佔用空閒資源,致使其它隊列沒法使用這些空閒資源,這就是」彈性隊列」須要權衡的地方
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
<property>
<name>yarn.scheduler.fair.allocation.file</name>
<value>/usr/local/soft/cdh_support/hadoop-2.6.0-cdh5.9.3/etc/hadoop/capacity-scheduler.xml</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.shuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>Master:8025</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>Master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>Master:8050</value>
</property>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>30720</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>30</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>10</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>10</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>1</value>
</property>
<property>
   <name>hadoop.proxyuser.admin.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.admin.groups</name>
    <value>*</value>
</property>
</configuration>
複製代碼
詳細配置
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
<property>
<name>yarn.scheduler.fair.allocation.file</name>
<value>/usr/local/soft/cdh_support/hadoop-2.6.0-cdh5.9.3/etc/hadoop/capacity-scheduler.xml</value>
</property>
複製代碼
案例測試
spark-shell --master yarn --executor-memory 1024m --num-executors 3 --executor-cores 4 --queue yq
複製代碼
版權聲明:本套技術專欄是做者(秦凱新)平時工做的總結和昇華,經過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和集羣環境容量規劃等內容,請持續關注本套博客。QQ郵箱地址:1120746959@qq.com,若有任何技術交流,可隨時聯繫。
參考文檔
http://www.cnblogs.com/xiaodf/p/6266201.html
https://blog.csdn.net/qq_36753550/article/details/83065546
https://blog.csdn.net/dxl342/article/details/52840455
http://www.cnblogs.com/xiaodf/p/6266201.html
複製代碼
版權聲明:本套技術專欄是做者(秦凱新)平時工做的總結和昇華,經過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和集羣環境容量規劃等內容,請持續關注本套博客。QQ郵箱地址:1120746959@qq.com,若有任何技術交流,可隨時聯繫。
秦凱新 於深圳