需求
公司里有兩個部門,一個叫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管理控制台可以看到結果。
注意:如果配置沒有同步到所有的節點,一些隊列會無法啟用。