Hadoop YARN中內(nèi)存和CPU兩種資源的調(diào)度和隔離
Hadoop YARN同時(shí)支持內(nèi)存和CPU兩種資源的調(diào)度(默認(rèn)只支持內(nèi)存,如果想進(jìn)一步調(diào)度CPU,需要自己進(jìn)行一些配置),本文將介紹YARN是如何對(duì)這些資源進(jìn)行調(diào)度和隔離的。
在YARN中,資源管理由ResourceManager和NodeManager共同完成,其中,ResourceManager中的調(diào)度器負(fù)責(zé) 資源的分配,而NodeManager則負(fù)責(zé)資源的供給和隔離。ResourceManager將某個(gè)NodeManager上資源分配給任務(wù)(這就是所 謂的“資源調(diào)度”)后,NodeManager需按照要求為任務(wù)提供相應(yīng)的資源,甚至保證這些資源應(yīng)具有獨(dú)占性,為任務(wù)運(yùn)行提供基礎(chǔ)的保證,這就是所謂的 資源隔離。
關(guān)于Hadoop YARN資源調(diào)度器的詳細(xì)介紹,可參考我的這篇文章:YARN/MRv2 Resource Manager深入剖析—資源調(diào)度器。
在正式介紹具體的資源調(diào)度和隔離之前,先品味一下內(nèi)存和CPU這兩種資源的特點(diǎn),這是兩種性質(zhì)不同的資源。內(nèi)存資源的多少會(huì)會(huì)決定任務(wù)的生死,如果內(nèi)存不夠,任務(wù)可能會(huì)運(yùn)行失??;相比之下,CPU資源則不同,它只會(huì)決定任務(wù)運(yùn)行的快慢,不會(huì)對(duì)生死產(chǎn)生影響。
【YARN中內(nèi)存資源的調(diào)度和隔離】
基于以上考慮,YARN允許用戶配置每個(gè)節(jié)點(diǎn)上可用的物理內(nèi)存資源,注意,這里是“可用的”,因?yàn)橐粋€(gè)節(jié)點(diǎn)上的內(nèi)存會(huì)被若干個(gè)服務(wù)共享,比如一部分給YARN,一部分給HDFS,一部分給HBase等,YARN配置的只是自己可以使用的,配置參數(shù)如下:
(1)yarn.nodemanager.resource.memory-mb
表示該節(jié)點(diǎn)上YARN可使用的物理內(nèi)存總量,默認(rèn)是8192(MB),注意,如果你的節(jié)點(diǎn)內(nèi)存資源不夠8GB,則需要調(diào)減小這個(gè)值,而YARN不會(huì)智能的探測(cè)節(jié)點(diǎn)的物理內(nèi)存總量。
(2)yarn.nodemanager.vmem-pmem-ratio
任務(wù)每使用1MB物理內(nèi)存,最多可使用虛擬內(nèi)存量,默認(rèn)是2.1。
(3) yarn.nodemanager.pmem-check-enabled
是否啟動(dòng)一個(gè)線程檢查每個(gè)任務(wù)正使用的物理內(nèi)存量,如果任務(wù)超出分配值,則直接將其殺掉,默認(rèn)是true。
(4) yarn.nodemanager.vmem-check-enabled
是否啟動(dòng)一個(gè)線程檢查每個(gè)任務(wù)正使用的虛擬內(nèi)存量,如果任務(wù)超出分配值,則直接將其殺掉,默認(rèn)是true。
(5)yarn.scheduler.minimum-allocation-mb
單個(gè)任務(wù)可申請(qǐng)的最少物理內(nèi)存量,默認(rèn)是1024(MB),如果一個(gè)任務(wù)申請(qǐng)的物理內(nèi)存量少于該值,則該對(duì)應(yīng)的值改為這個(gè)數(shù)。
(6)yarn.scheduler.maximum-allocation-mb
單個(gè)任務(wù)可申請(qǐng)的最多物理內(nèi)存量,默認(rèn)是8192(MB)。
默認(rèn)情況下,YARN采用了線程監(jiān)控的方法判斷任務(wù)是否超量使用內(nèi)存,一旦發(fā)現(xiàn)超量,則直接將其殺死。由于Cgroups對(duì)內(nèi)存的控制缺乏靈活性 (即任務(wù)任何時(shí)刻不能超過(guò)內(nèi)存上限,如果超過(guò),則直接將其殺死或者報(bào)OOM),而Java進(jìn)程在創(chuàng)建瞬間內(nèi)存將翻倍,之后驟降到正常值,這種情況下,采用 線程監(jiān)控的方式更加靈活(當(dāng)發(fā)現(xiàn)進(jìn)程樹(shù)內(nèi)存瞬間翻倍超過(guò)設(shè)定值時(shí),可認(rèn)為是正?,F(xiàn)象,不會(huì)將任務(wù)殺死),因此YARN未提供Cgroups內(nèi)存隔離機(jī)制。
【YARN中CPU資源的調(diào)度和隔離】
在YARN中,CPU資源的組織方式仍在探索中,目前(2.2.0版本)只是一個(gè)初步的,非常粗粒度的實(shí)現(xiàn)方式,更細(xì)粒度的CPU劃分方式已經(jīng)提出來(lái)了,正在完善和實(shí)現(xiàn)中。
目前的CPU被劃分成虛擬CPU(CPU virtual Core),這里的虛擬CPU是YARN自己引入的概念,初衷是,考慮到不同節(jié)點(diǎn)的CPU性能可能不同,每個(gè)CPU具有的計(jì)算能力也是不一樣的,比如某個(gè) 物理CPU的計(jì)算能力可能是另外一個(gè)物理CPU的2倍,這時(shí)候,你可以通過(guò)為***個(gè)物理CPU多配置幾個(gè)虛擬CPU彌補(bǔ)這種差異。用戶提交作業(yè)時(shí),可以指 定每個(gè)任務(wù)需要的虛擬CPU個(gè)數(shù)。在YARN中,CPU相關(guān)配置參數(shù)如下:
(1)yarn.nodemanager.resource.cpu-vcores
表示該節(jié)點(diǎn)上YARN可使用的虛擬CPU個(gè)數(shù),默認(rèn)是8,注意,目前推薦將該值設(shè)值為與物理CPU核數(shù)數(shù)目相同。如果你的節(jié)點(diǎn)CPU核數(shù)不夠8個(gè),則需要調(diào)減小這個(gè)值,而YARN不會(huì)智能的探測(cè)節(jié)點(diǎn)的物理CPU總數(shù)。
(2) yarn.scheduler.minimum-allocation-vcores
單個(gè)任務(wù)可申請(qǐng)的最小虛擬CPU個(gè)數(shù),默認(rèn)是1,如果一個(gè)任務(wù)申請(qǐng)的CPU個(gè)數(shù)少于該數(shù),則該對(duì)應(yīng)的值改為這個(gè)數(shù)。
(3)yarn.scheduler.maximum-allocation-vcores
單個(gè)任務(wù)可申請(qǐng)的最多虛擬CPU個(gè)數(shù),默認(rèn)是32。
默認(rèn)情況下,YARN是不會(huì)對(duì)CPU資源進(jìn)行調(diào)度的,你需要配置相應(yīng)的資源調(diào)度器讓你支持,具體可參考我的這兩篇文章:
(1)Hadoop YARN配置參數(shù)剖析(4)—Fair Scheduler相關(guān)參數(shù)
(2)Hadoop YARN配置參數(shù)剖析(5)—Capacity Scheduler相關(guān)參數(shù)
默認(rèn)情況下,NodeManager不會(huì)對(duì)CPU資源進(jìn)行任何隔離,你可以通過(guò)啟用Cgroups讓你支持CPU隔離。
由于CPU資源的獨(dú)特性,目前這種CPU分配方式仍然是粗粒度的。舉個(gè)例子,很多任務(wù)可能是IO密集型的,消耗的CPU資源非常少,如果此時(shí)你為它 分配一個(gè)CPU,則是一種嚴(yán)重浪費(fèi),你完全可以讓他與其他幾個(gè)任務(wù)公用一個(gè)CPU,也就是說(shuō),我們需要支持更粒度的CPU表達(dá)方式。
借鑒亞馬遜EC2中CPU資源的劃分方式,即提出了CPU最小單位為EC2 Compute Unit(ECU),一個(gè)ECU代表相當(dāng)于1.0-1.2 GHz 2007 Opteron or 2007 Xeon處理器的處理能力。YARN提出了CPU最小單位YARN Compute Unit(YCU),目前這個(gè)數(shù)是一個(gè)整數(shù),默認(rèn)是720,由參數(shù)yarn.nodemanager.resource.cpu-ycus-per- core設(shè)置,表示一個(gè)CPU core具備的計(jì)算能力(該feature在2.2.0版本中并不存在,可能增加到2.3.0版本中),這樣,用戶提交作業(yè)時(shí),直接指定需要的YCU即 可,比如指定值為360,表示用1/2個(gè)CPU core,實(shí)際表現(xiàn)為,只使用一個(gè)CPU core的1/2計(jì)算時(shí)間。注意,在操作系統(tǒng)層,CPU資源是按照時(shí)間片分配的,你可以說(shuō),一個(gè)進(jìn)程使用1/3的CPU時(shí)間片,或者1/5的時(shí)間片。
https://issues.apache.org/jira/browse/YARN-1089
https://issues.apache.org/jira/browse/YARN-1024
Hadoop 新特性、改進(jìn)、優(yōu)化和Bug分析系列5:YARN-3
【總結(jié)】
目前,YARN 內(nèi)存資源調(diào)度借鑒了Hadoop 1.0中的方式,比較合理,但CPU資源的調(diào)度方式仍在不斷改進(jìn)中,目前只是一個(gè)初步的粗糙實(shí)現(xiàn),相信在不久的將來(lái),YARN 中CPU資源的調(diào)度將更加完善。
原文鏈接:http://dongxicheng.org/mapreduce-nextgen/hadoop-yarn-memory-cpu-scheduling/