大數據處理離不開hadoop集群的部署和管理,對於本來硬件資源就不多的創業團隊來說,做好資源的共享和隔離是很有必要的,畢竟不像BAT那么豪,那么怎么樣能把有限的節點同時分享給多組用戶使用而且互不影響呢,我們來研究一下yarn多隊列做資源隔離
請尊重原創,轉載請注明來源網站www.shareditor.com以及原始鏈接地址
CapacityScheduler
使用過第一代hadoop的同學應該比較熟悉mapred.job.map.capacity/mapred.job.reduce.capacity這個參數,無論是map還是reduce都可以配置capacity(也就是並發數),表示同時可以有多少個map(或reduce)運行,通過這個參數可以限制一個任務同時占用的資源(節點)數,這樣不至於影響其他任務的執行。
在這里有人會問:我把任務的priority設置成VERY LOW不就行了嗎?其實這樣在某些場景下不能解決全部問題,因為假如你一個VERY LOW的任務剛啟動時沒有其他人的任務,那么會先占用所有節點,如果你的每一個task運行時間都是1天,那么其他任務就算優先級再高也只能傻等一天,所以才有必要做資源隔離
第二代hadoop因為使用yarn做資源管理,沒有了槽位的概念,所以就沒有了capacity。但是在yarn中專門有了CapacityScheduler這個組件。這是一個可插裝的調度器,它的用途就是對多用戶實現共享大集群並對每個用戶資源占用做控制
對於很豪的公司來說,每個用戶(團隊)自己有一個hadoop集群,這樣可以提高自身的穩定性和資源供應,但是確降低了資源利用率,因為很多集群大多數時間都是空閑的。CapacityScheduler能實現這樣的功能:每個組固定享有集群里的一部分資源,保證低保,同時如果這個固定的資源空閑,那么可以提供給其他組來搶占,但是一旦這些資源的固定使用者要用,那么立即釋放給它使用。這種機制在實現上是通過queue(隊列)來實現的。當然CapacityScheduler還支持子隊列(sub-queue),
hadoop資源分配的默認配置
我在《教你成為全棧工程師(Full Stack Developer) 四十五-一文讀懂hadoop、hbase、hive、spark分布式系統架構》中詳細描述了整體一套hadoop搭建的方法。那么在搭建完成后我們發現對於資源分配方面,yarn的默認配置是這樣的
也就是有一個默認的隊列
事實上,是否使用CapacityScheduler組件是可以配置的,但是默認配置就是這個CapacityScheduler,如果想顯式配置需要修改conf/yarn-site.xml內容如下:
<property> <name>yarn.resourcemanager.scheduler.class</name> <value> org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler </value> </property>
上面圖中標明了默認隊列是default,是使用了CapacityScheduler的默認配置
我們看一下有關這里的default是怎么配置的,見capacity-scheduler.xml配置:
<property> <name>yarn.scheduler.capacity.root.queues</name> <value>default</value> <description> The queues at the this level (root is the root queue). </description> </property>
這里的配置項格式應該是yarn.scheduler.capacity.<queue-path>.queues,也就是這里的root是一個queue-path,因為這里配置了value是default,所以root這個queue-path只有一個隊列叫做default,那么有關default的具體配置都是形如下的配置項:
yarn.scheduler.capacity.root.default.capacity:一個百分比的值,表示占用整個集群的百分之多少比例的資源,這個queue-path下所有的capacity之和是100
yarn.scheduler.capacity.root.default.user-limit-factor:每個用戶的低保百分比,比如設置為1,則表示無論有多少用戶在跑任務,每個用戶占用資源最低不會少於1%的資源
yarn.scheduler.capacity.root.default.maximum-capacity:彈性設置,最大時占用多少比例資源
yarn.scheduler.capacity.root.default.state:隊列狀態,可以是RUNNING或STOPPED
yarn.scheduler.capacity.root.default.acl_submit_applications:哪些用戶或用戶組可以提交人物
yarn.scheduler.capacity.root.default.acl_administer_queue:哪些用戶或用戶組可以管理隊列
當然我們可以繼續以root.default為queue-path創建他的子隊列,比如:
<property> <name>yarn.scheduler.capacity.root.default.queues</name> <value>a,b,c</value> <description> The queues at the this level (root is the root queue). </description> </property>
這是一個樹結構,一般和公司的組織架構有關
配置好上述配置后執行
yarn rmadmin -refreshQueues
生效后發現yarn隊列情況類似下面的樣子(配置了兩個隊列:research和default):
如果希望自己的任務調度到research隊列,只需在啟動任務時指定:mapreduce.job.queuename參數為research即可