Hadoop計算能力調度器應用和配置


需求

公司里有兩個部門,一個叫hive,一個叫pig,這兩個部門都需要使用公司里的hadoop集群。於是問題來了,因為hadoop默認是FIFO調度的,誰先提交任務,誰先被處理,於是hive部門很擔心pig這個部門提交一個耗時的任務,影響了hive的業務,hive希望可以和pig在高峰期時,平均使用整個集群的計算容量,互不影響。

思路

hadoop的默認調度器是FIFO,但是也有計算容量調度器,這個調度器可以解決上述問題。可以在hadoop里配置三個隊列,一個是default,一個是hive,一個是pig。他們的計算容量分別是30%,40%,30%.這樣hive和pig這兩個部門,分為使用hive和pig兩個隊列,其中default作為其他部門或者臨時使用。但是,如果hive部門和pig部門又希望,在平常時,沒有人用集群的時候,hive或者部門可以使用100%的計算容量。

解決方法

修改hadoop的配置文件mapred-site.xml:

<property> 
  <name>mapred.jobtracker.taskScheduler</name> 
  <value>org.apache.hadoop.mapred.CapacityTaskScheduler</value> 
</property> 
<property> 
  <name>mapred.queue.names</name> 
  <value>default,hive,pig</value> 
</property>

 

在capacity-scheduler.xml文件中填寫如下內容:

<property>
    <name>mapred.capacity-scheduler.queue.hive.capacity</name>
    <value>40</value>
    <description>Percentage of the number of slots in the cluster that are
      to be available for jobs in this queue.
    </description>    
  </property>
  
  <property>
    <name>mapred.capacity-scheduler.queue.hive.maximum-capacity</name>
    <value>-1</value>
    <description>
    </description>    
  </property>
  
  <property>
    <name>mapred.capacity-scheduler.queue.hive.supports-priority</name>
    <value>true</value>
    <description></description>
  </property>
  
    <property>
    <name>mapred.capacity-scheduler.queue.hive.minimum-user-limit-percent</name>
    <value>100</value>
    <description> </description>
  </property>

  <property>
    <name>mapred.capacity-scheduler.queue.hive.user-limit-factor</name>
    <value>3</value>
    <description></description>
  </property>

  <property>
    <name>mapred.capacity-scheduler.queue.hive.maximum-initialized-active-tasks</name>
    <value>200000</value>
    <description></description>
  </property>

  <property>
    <name>mapred.capacity-scheduler.queue.hive.maximum-initialized-active-tasks-per-user</name>
    <value>100000</value>
    <description></description>
  </property>
  
  <property>
    <name>mapred.capacity-scheduler.queue.hive.init-accept-jobs-factor</name>
    <value>10</value>
    <description></description>
  </property>
  
<!-- pig -->
<property>
    <name>mapred.capacity-scheduler.queue.pig.capacity</name>
    <value>30</value>
    <description></description>    
  </property>
  
  <property>
    <name>mapred.capacity-scheduler.queue.pig.maximum-capacity</name>
    <value>-1</value>
    <description></description>    
  </property>
  
  <property>
    <name>mapred.capacity-scheduler.queue.pig.supports-priority</name>
    <value>true</value>
    <description>If true, priorities of jobs will be taken into 
      account in scheduling decisions.
    </description>
  </property>
  
    <property>
    <name>mapred.capacity-scheduler.queue.pig.minimum-user-limit-percent</name>
    <value>100</value>
    <description></description>
  </property>

  <property>
    <name>mapred.capacity-scheduler.queue.pig.user-limit-factor</name>
    <value>4</value>
    <description>The multiple of the queue capacity which can be configured to
    allow a single user to acquire more slots.
    </description>
  </property>

  <property>
    <name>mapred.capacity-scheduler.queue.pig.maximum-initialized-active-tasks</name>
    <value>200000</value>
    <description></description>
  </property>

  <property>
    <name>mapred.capacity-scheduler.queue.pig.maximum-initialized-active-tasks-per-user</name>
    <value>100000</value>
    <description></description>
  </property>
  
  <property>
    <name>mapred.capacity-scheduler.queue.pig.init-accept-jobs-factor</name>
    <value>10</value>
    <description></description>
  </property>

<!-- default --> 
  <property>
    <name>mapred.capacity-scheduler.queue.default.capacity</name>
    <value>30</value>
    <description></description>    
  </property>
  
  <property>
    <name>mapred.capacity-scheduler.queue.default.maximum-capacity</name>
    <value>-1</value>
    <description></description>    
  </property>
  
  <property>
    <name>mapred.capacity-scheduler.queue.default.supports-priority</name>
    <value>true</value>
    <description></description>
  </property>

  <property>
    <name>mapred.capacity-scheduler.queue.default.minimum-user-limit-percent</name>
    <value>100</value>
    <description></description>
  </property>
  
  <property>
    <name>mapred.capacity-scheduler.queue.default.user-limit-factor</name>
    <value>4</value>
    <description></description>
  </property>

  <property>
    <name>mapred.capacity-scheduler.queue.default.maximum-initialized-active-tasks</name>
    <value>200000</value>
    <description></description>
  </property>

  <property>
    <name>mapred.capacity-scheduler.queue.default.maximum-initialized-active-tasks-per-user</name>
    <value>100000</value>
    <description></description>
  </property>

  <property>
    <name>mapred.capacity-scheduler.queue.default.init-accept-jobs-factor</name>
    <value>10</value>
    <description></description>
  </property>

這里配置了三個隊列,分別是hive,pig,default,hive的容量是40%,由屬性mapred.capacity-scheduler.queue.hive.capacity決定,其他隊列的容量同理可得。

需要配置hive,pig,default可以搶占整個集群的資源,由屬性mapred.capacity-scheduler.queue.hive.user-limit-factor絕對,hive隊列這個值是3,所以用戶可以使用的資源限量是40% * 3 =120%,所有有效計算容量是集群的100%.其他隊列的最大集群計算容量同理可得。

 

如何使用該隊列

mapreduce:在Job的代碼中,設置Job屬於的隊列,例如hive:

conf.setQueueName("hive");

hive:在執行hive任務時,設置hive屬於的隊列,例如pig:

set mapred.job.queue.name=pig;

 

動態更新集群隊列和容量

生產環境中,隊列及其容量的修改在現實中是不可避免的,而每次修改,需要重啟集群,這個代價很高,如果修改隊列及其容量的配置不重啟呢:

1.在主節點上根據具體需求,修改好mapred-site.xml和capacity-scheduler.xml

2.把配置同步到所有節點上

3.使用hadoop用戶執行命令:hadoop mradmin -refreshQueues

這樣就可以動態修改集群的隊列及其容量配置,不需要重啟了,刷新mapreduce的web管理控制台可以看到結果。

注意:如果配置沒有同步到所有的節點,一些隊列會無法啟用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM