Hadoop 容器調度器與公平調度器原理和實踐深刻剖析-Hadoop商業環境實戰

版權聲明:本套技術專欄是做者(秦凱新)平時工做的總結和昇華,經過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和集羣環境容量規劃等內容,請持續關注本套博客。QQ郵箱地址:1120746959@qq.com,若有任何技術交流,可隨時聯繫。html

1 公平調度(資源不夠也會運行,以最少的資源進行資源調度)

  • 不夠用時最多搶佔其餘隊列的應用只有一個 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:公平共享量搶佔時間。若是一個資源池在該時間內使用資源量一直低於公平共享量的一半,則開始搶佔資源。
    複製代碼

1.1 yarn-site.xml配置

<?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>
        &emsp;&emsp;       <name>hadoop.proxyuser.admin.hosts</name>
        &emsp;   &emsp;    <value>*</value>
           </property>
           <property>
        &emsp; &emsp;      <name>hadoop.proxyuser.admin.groups</name>
        &emsp;   &emsp;    <value>*</value>
           </property> 
    </configuration>
複製代碼

1.2 fair-allocation.xml詳細配置

  • 總資源爲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>
    複製代碼

1.3 配置效果展現(保證每個應用都可以搶佔運行,可是資源不夠時,以最低資源啓動)

  • 資源申請(默認超出隊列的任務只能有一個能夠向外隊列去借用資源)測試

    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

  • 超出Max Resources 將進行掛起,等待資源釋放

  • 釋放application_1545457701602_0008,觀測變化(不知足資源的任務會按照時間前後增長資源)

  • 釋放application_1545457701602_0009

  • 釋放application_1545457701602_0010

  • 從新申請任務(主要受到核數的影響,新申請任務得不到內存資源)

  • 釋放application_1545457701602_0012(佔用9核,新申請任務獲得申請的全部資源)

2 容量調度(實際配置,不夠用時最多搶佔其餘隊列的應用只有一個)

Capacity 調度器容許多個組織共享整個集羣,每一個組織能夠得到集羣的一部分計算能力。經過爲每一個組織分配專門的隊列,而後再爲每一個隊列分配必定的集羣資源,這樣整個集羣就能夠經過設置多個隊列的方式給多個組織提供服務了。除此以外,隊列內部又能夠垂直劃分,這樣一個組織內部的多個成員就能夠共享這個隊列資源了,在一個隊列內部,資源的調度是採用的是先進先出(FIFO)策略。

經過上面那幅圖,咱們已經知道一個job可能使用不了整個隊列的資源。然而若是這個隊列中運行多個job,若是這個隊列的資源夠用,那麼就分配給這些job,若是這個隊列的資源不夠用了呢?其實Capacity調度器仍可能分配額外的資源給這個隊列,這就是「彈性隊列」(queue elasticity)的概念。

在正常的操做中,Capacity調度器不會強制釋放Container,當一個隊列資源不夠用時,這個隊列只能得到其它隊列釋放後的Container資源。固然,咱們能夠爲隊列設置一個最大資源使用量,以避免這個隊列過多的佔用空閒資源,致使其它隊列沒法使用這些空閒資源,這就是」彈性隊列」須要權衡的地方

capacity-scheduler.xml配置

<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>
&emsp;&emsp;       <name>hadoop.proxyuser.admin.hosts</name>
&emsp;   &emsp;    <value>*</value>
   </property>
   <property>
&emsp; &emsp;      <name>hadoop.proxyuser.admin.groups</name>
&emsp;   &emsp;    <value>*</value>
   </property> 
</configuration>
複製代碼

yarn-site.xml配置

  • 詳細配置

    <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
    複製代碼

3 總結

版權聲明:本套技術專欄是做者(秦凱新)平時工做的總結和昇華,經過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和集羣環境容量規劃等內容,請持續關注本套博客。QQ郵箱地址:1120746959@qq.com,若有任何技術交流,可隨時聯繫。

秦凱新 於深圳

相關文章
相關標籤/搜索