導(dǎo)語|傳統(tǒng)HADOOP生態(tài)系統(tǒng)使用YARN管理/調(diào)度計算資源,該系統(tǒng)?般具有明顯的資源使?周期。實時計算集群資源消耗主要在?天,而數(shù)據(jù)報表型業(yè)務(wù)則安排在離線計算集群中。離在線業(yè)務(wù)分開部署的首要問題就是資源使用率低,消耗成本?。隨著業(yè)務(wù)的增?和突發(fā)的報表計算需求,為了解決為離線集群預(yù)留資源,騰訊云EMR團隊和容器團隊聯(lián)合推出Hadoop Yarn on Kubernetes Pod,以提?容器資源使用率,降低資源成本,將閑時容器集群CPU使?率提升數(shù)倍之多。本文主要介紹HADOOP資源調(diào)度器YARN在容器環(huán)境中的優(yōu)化與實踐。
一、Hadoop Yarn on Kubernetes Pod混合部署模式
Hadoop Yarn on Kubernetes Pod方案提供彈性擴縮容和離在線混合部署兩項功能。彈性擴縮容主要聚焦于如何利?云原生資源,快速擴容資源以補充算力。離在線混合部署模式的目的是為了充分使用在線集群的空閑資源,盡可能減少為離線集群預(yù)留空閑資源的頻次。
EMR彈性擴縮容模塊(yarn-autoscaler)提供按負載和按時間彈性伸縮兩種擴縮容方式。對于按負載伸縮,用戶可以對不同指標設(shè)置閾值來觸發(fā)擴縮容,比如設(shè)置Yarn隊列中availablevcore、pending vcore、available mem、pending mem。亦可以使用時間擴縮規(guī)則,按天、按周、按月等規(guī)則指定觸發(fā)。
當彈性規(guī)則被觸發(fā)后,離在線部署模塊獲取當前在線TKE集群中可以提供的閑置算力的規(guī)格及數(shù)量,調(diào)用Kubernetes api創(chuàng)建對應(yīng)數(shù)量的資源,ex-scheduler擴展調(diào)度器確保Pod被創(chuàng)建在剩余資源更多的節(jié)點上,該POD負責(zé)啟動YARN的服務(wù)。
通過該方案,Yarn的NodeManager服務(wù)可以快速部署到POD節(jié)點中。但也Yarn原生調(diào)度沒有考慮異構(gòu)資源,由此引發(fā)了兩個問題:
1.AM的POD被驅(qū)逐,導(dǎo)致APP失敗
在node節(jié)點的資源緊缺的條件下,kubelet為了保證node節(jié)點的穩(wěn)定性,回觸發(fā)主動驅(qū)逐pod的機制。如果該節(jié)點存在AM服務(wù),則整個Application就要被視為失敗,ResourceManager此時會重新分配AM。對于計算量很大的任務(wù),Application重跑的代價不可承受。
2.Yarn原生非獨占分區(qū)資源共享局限性
Yarn的標簽分區(qū)特性?持獨占分區(qū)(Exclusive),非獨占分區(qū)(Non-exclusive)。
·獨占分區(qū)(Exclusive):例如指定獨占分區(qū)x,Yarn的container只會分配到該x分區(qū)。
·非獨占分區(qū)(Non-exclusive):例如非獨占分區(qū)x,x分區(qū)的資源可以共享給default分區(qū)。
只有當指定分區(qū)default時,default上運?的Application可以使?分區(qū)x的資源。
但是在實際使?場景中,?戶要給各個業(yè)務(wù)部門分配各自的獨占分區(qū)資源,同時會劃分出供各部門使用的default分區(qū)。default分區(qū)資源會比較充足,業(yè)務(wù)部門希望能夠使用自己的獨占分區(qū)和同時充分利用default分區(qū)資源,獨占分區(qū)資源和default分區(qū)都不夠用的時候,才會觸發(fā)彈性擴容,往屬于自己的獨占分區(qū)中擴容資源。
二、對Yarn改造帶來的挑戰(zhàn)
對上述feature的開發(fā),除了需求技術(shù)本?的難度。還需要考慮到盡可能降低用戶存量集群穩(wěn)定性的影響,減少用戶業(yè)務(wù)側(cè)改造成本。
·集群穩(wěn)定性:Hadoop Yarn作為大數(shù)據(jù)系統(tǒng)中的基礎(chǔ)調(diào)度組件,如果改動過多,引發(fā)的故障幾率就會增大。同時引入的feature,必然需要升級存量集群的Haoop Yarn。升級操作要做到對存量業(yè)務(wù)集群無感知,不能影響到當天的業(yè)務(wù)。
·業(yè)務(wù)側(cè)使用成本:引入的新feature也必須符合原?yarn的使用習(xí)慣,方便業(yè)務(wù)側(cè)用戶理解,同時降低業(yè)務(wù)側(cè)對代碼的改造。
1.AM自主選擇存儲介質(zhì)
目前Yarn的社區(qū)沒有考慮云上異構(gòu)資源混合部署的特點。在線TKE集群中,當資源緊張時會對容器進行驅(qū)逐。為了避免Appliction重新計算,浪費資源的現(xiàn)象,必須提供AM可以指定能否分配到POD類型資源。
自主選擇存儲介質(zhì)中,使用配置化標識,由NodeManager通過RPC上報能否將資源提供給AM使用,ResourceManager通過上報信息決定將Application的AM分配到穩(wěn)定資源介質(zhì)中。由NodeManager通過配置化上報信息的好處是顯而易見的:
·去集中化:減少ResourceManager處理邏輯。否則,擴容資源時,還需將資源信息通過RPC/配置流入到ResourceManager中。如無必要,勿增實體,對ResourceManager的改造應(yīng)該輕量化。
·集群穩(wěn)定性:存量業(yè)務(wù)集群對Yarn升級后,需要重啟NodeManager,只需要重啟ResourceManager。Yare的高可用特性可保證升級過程對業(yè)務(wù)無影響。無需重啟NodeManager的原因是,NM默認將本機資源視為可分配。
·簡單易用:用戶可以通過配置?由決定任務(wù)資源擁有分配AM的權(quán)利,不單單局限POD容器資源。
2.多標簽動態(tài)分配資源
Yarn的原生標簽設(shè)計中,提交任務(wù)時的標簽表達式中只能含有單個標簽。如果為了提?利用率,同時使用多個分區(qū)資源,就必須將非default分區(qū)設(shè)置為Non-exclusive特性。標簽表達式必須解決如下三個問題:
·資源隔離:分區(qū)A設(shè)置Non-exclusive后,資源被其他分區(qū)上的APP占用后,無法及時交換給分區(qū)A的App。
·自由共享資源:只有default分區(qū)才有資格申請Non-exclusive分區(qū)資源。
·動態(tài)選擇分區(qū)資源:多分區(qū)資源共享時,無法根據(jù)分區(qū)剩余資源大小選擇可用區(qū),影響任務(wù)執(zhí)行效率。
騰訊云EMR團隊通過支持擴展表達式語法,增加對邏輯運算符表達式的支持,使App可以申請多個分區(qū)資源。同時開發(fā)資源統(tǒng)計模塊動態(tài)統(tǒng)計分區(qū)可用資源,為App分配最合適的分區(qū)。
三、實操演練
測試環(huán)境:指定172.17.48.28/172.17.48.17的NodeManager為default分區(qū),172.17.48.29/172.17.48.26的NodeManager為x分區(qū)。
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>a,b</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.accessible-node-labels.x.capacity</nam e>
<value>100</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.accessible-node-labels.y.capacity</nam e>
<value>100</value>
</property>
<!-- configuration of queue-a -->
<property>
<name>yarn.scheduler.capacity.root.a.accessible-node-labels</name>
<value>x</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.a.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.a.accessible-node-labels.x.capacity</n ame>
<value>100</value>
</property>
<!-- configuration of queue-b -->
<property>
<name>yarn.scheduler.capacity.root.b.accessible-node-labels</name>
<value>y</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.b.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.b.accessible-node-labels.y.capacity</n ame>
<value>100</value>
</property>
</configuration>
1.規(guī)定AM只能分配在172.17.48.28
對另外三個節(jié)點的NodeManager節(jié)點配置如下配置項:
yarn.nodemanager.am-alloc-disabled=true
配置后,提交的Application的AM只能在172.17.48.28節(jié)點啟動。
2.使用組合標簽
通過mapreduce.job.node-label-expression指定標簽表達式,x||表示同時使用x/default分區(qū)。
hadoop jar/usr/local/service/hadoop/share/hadoop/mapreduce/hadoop-mapredu ce-examples-3.1.2.jar pi-D mapreduce.job.queuename="a"-D mapreduce.job.node-label-expression="x||"10 10
使用該命令提交后,觀察到Application的container被分配在x/default分區(qū)。
四、Hadoop Yarn on Kubernetes Pod最佳實踐
該客戶大數(shù)據(jù)應(yīng)用和存儲跑在Yarn管理的大數(shù)據(jù)集群,在生產(chǎn)環(huán)境中,面臨諸多問題,主要體現(xiàn)在大數(shù)據(jù)的算力不足和在線業(yè)務(wù)波谷時資源的浪費。如離線計算在算力不足時,數(shù)據(jù)準時性無法得到保證,尤其是當遇到隨機緊急大數(shù)據(jù)查詢?nèi)蝿?wù),沒有可用的計算資源,只能停掉已有的計算任務(wù),或者等已有任務(wù)完成,?論哪種?式,總體任務(wù)執(zhí)行的效率都會大打折扣。
基于Hadoop Yarn on Kubernetes Pod方案,將離線任務(wù)自動擴容至云上集群,與TKE在線業(yè)務(wù)集群混合部署,充分利用云上波谷時段的閑置資源,提高離線業(yè)務(wù)的算力,并利用云上資源快速的彈性擴容能力,及時補充離線計算的算力。
通過Hadoop Yarn on Kubernetes Pod?案對客戶的在線TKE集群資源使用進下優(yōu)化后,集群閑時CPU使用率能提高500%。
在線集群閑時CPU占用
離在線混部后CPU占用
五、總結(jié)
本文提出了基于YARN針對云原生容器化的優(yōu)化與實踐,在混合部署云原生環(huán)境中,極大地提高了任務(wù)運行的穩(wěn)定性,高效性,有效提高了集群資源利用率,節(jié)約硬件成本。在未來,我們會探討更多大數(shù)據(jù)云原生場景,為企業(yè)客戶帶來更多的實際效益。