參考:http://blog.csdn.net/xia562653223/article/details/18811661#
公平調度器是由facebook貢獻的,適合于多用戶共享集群的環境的調度器,其吞吐率高于FIFO,
1、公平調度介紹
公平調度器按資源池(pool)來組織作業,并把資源公平的分到這些資源池里。默認情況下,每一個用戶擁有一個獨立的資源池,以使每個用戶都能獲得一份等同的集群資源而不管他們提交了多少作業。按用戶的 Unix 群組或作業配置(jobconf)屬性來設置作業的資源池也是可以的。在每一個資源池內,會使用公平共享(fair sharing)的方法在運行作業之間共享容量(capacity)。用戶也可以給予資源池相應的權重,以不按比例的方式共享集群。
除了提供公平共享方法外,公平調度器允許賦給資源池保證(guaranteed)最小共享資源,這個用在確保特定用戶、群組或生產應用程序總能獲取到足夠的資源時是很有用的。當一個資源池包含作業時,它至少能獲取到它的最小共享資源,但是當資源池不完全需要它所擁有的保證共享資源時,額外的部分會在其它資源池間進行切分。
主要特點如下:
? 支持多用戶多隊列
? 資源公平共享(公平共享量由優先級決定)
? 保證最小共享量
? 支持時間片搶占
? 限制作業并發量,以防止中間數據塞滿磁盤
2、配置公平調度器
配置 yarn-site.xml
<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>/soft/hadoop/etc/hadoop/fair-allocation.xml</value>
</property>
<property>
<name>yarn.scheduler.fair.user-as-default-queue</name>
<value>false</value>
</property>
<property>
<name>yarn.scheduler.fair.preemption</name>
<value>false</value>
</property>
<property>
<name>yarn.scheduler.fair.sizebasedweight</name>
<value>true</value>
</property>
<property>
<name>yarn.scheduler.fair.assignmultiple</name>
<value>true</value>
</property>
<property>
<name>yarn.scheduler.fair.max.assign</name>
<value>-1</value>
</property>
<property>
<name>yarn.scheduler.fair.locality.threshold.node</name>
<value>0.1</value>
</property>
<property>
<name>yarn.scheduler.fair.locality.threshold.rack</name>
<value>0.1</value>
</property>
配置 fair-allocation.xml
<?xml version="1.0"?>
<allocations>
<queue name="root">
<minResources>10000mb,10vcores</minResources>
<maxResources>90000mb,100vcores</maxResources>
<maxRunningApps>50</maxRunningApps>
<weight>2.0</weight>
<schedulingMode>fair</schedulingMode>
<aclSubmitApps> </aclSubmitApps>
<aclAdministerApps> </aclAdministerApps>
<queue name="queue1">
<minResources>10000mb,10vcores</minResources>
<maxResources>90000mb,100vcores</maxResources>
<maxRunningApps>50</maxRunningApps>
<weight>2.0</weight>
<schedulingMode>fair</schedulingMode>
<aclAdministerApps>ubuntu,ubuntu</aclAdministerApps>
<aclSubmitApps>ubuntu,ubuntu</aclSubmitApps>
</queue>
</queue>
<user name="ubuntu">
<maxRunningApps>30</maxRunningApps>
</user>
<userMaxAppsDefault>5</userMaxAppsDefault>
</allocations>
3、測試
測試腳本test.sh
#!/bin/bash
if [ $# -lt 1 ] ; then
echo 'Usage: test.sh n'
exit -1
fi
n=$1
hadoop fs -rmr /out*
#for i in $(seq 1 $n)
for (( i=1;i<=$n;i++ ))
do
echo "/out/${i}"
nohup hadoop jar ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount -Dmapred.job.queue.name=root.queue1 /profile /out${n} &
done
echo "complete"
上述腳本主要是運行hadoop自帶例子wordcount,在運行之前需要就測試數據上傳到hdfs上,這里我們為了方便將/etc/profile上傳到了hdfs的根目錄下: hadoop fs -put /etc/profile /
這里為了測試,將ubuntu的最大提交任務數設置為3個,便于測試。
./test.sh 4
手動提交4個任務,得到的結果如下圖所示:
從圖二可以看出有三個任務處于激活狀態,1個處于等待狀態。到此,公平調度器設置成功。
(注:由于集群采用的是默認配置三個slave幾點,所以默認只有24個VCores,所能獲取的最大資源也是默認的,從而配額文件fair-allocation.xml中配置的最大資源未生效 )