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