Yarn 内存分配管理机制及相关参数配置
理解Yarn的內(nèi)存管理與分配機(jī)制,對(duì)于我們搭建、部署集群,開(kāi)發(fā)維護(hù)應(yīng)用都是尤為重要的,對(duì)于這方面我做了一些調(diào)研供大家參考。
一、相關(guān)配置情況
關(guān)于Yarn內(nèi)存分配與管理,主要涉及到了ResourceManage、ApplicationMatser、NodeManager這幾個(gè)概念,相關(guān)的優(yōu)化也要緊緊圍繞著這幾方面來(lái)開(kāi)展。這里還有一個(gè)Container的概念,現(xiàn)在可以先把它理解為運(yùn)行map/reduce?task的容器,后面有詳細(xì)介紹。
?
1.1??RM的內(nèi)存資源配置,?配置的是資源調(diào)度相關(guān)
RM1:yarn.scheduler.minimum-allocation-mb?分配給AM單個(gè)容器可申請(qǐng)的最小內(nèi)存
RM2:yarn.scheduler.maximum-allocation-mb?分配給AM單個(gè)容器可申請(qǐng)的最大內(nèi)存
注:
l?最小值可以計(jì)算一個(gè)節(jié)點(diǎn)最大Container數(shù)量
l?一旦設(shè)置,不可動(dòng)態(tài)改變
1.2?NM的內(nèi)存資源配置,配置的是硬件資源相關(guān)
NM1:yarn.nodemanager.resource.memory-mb?節(jié)點(diǎn)最大可用內(nèi)存
NM2:yarn.nodemanager.vmem-pmem-ratio?虛擬內(nèi)存率,默認(rèn)2.1
注:
l?RM1、RM2的值均不能大于NM1的值
l?NM1可以計(jì)算節(jié)點(diǎn)最大最大Container數(shù)量,max(Container)=NM1/RM2
l?一旦設(shè)置,不可動(dòng)態(tài)改變
1.3?AM內(nèi)存配置相關(guān)參數(shù),配置的是任務(wù)相關(guān)
AM1:mapreduce.map.memory.mb?分配給map?Container的內(nèi)存大小
AM2:mapreduce.reduce.memory.mb?分配給reduce?Container的內(nèi)存大小
l?這兩個(gè)值應(yīng)該在RM1和RM2這兩個(gè)值之間
l?AM2的值最好為AM1的兩倍
l?這兩個(gè)值可以在啟動(dòng)時(shí)改變
AM3:mapreduce.map.java.opts?運(yùn)行map任務(wù)的jvm參數(shù),如-Xmx,-Xms等選項(xiàng)
AM4:mapreduce.reduce.java.opts?運(yùn)行reduce任務(wù)的jvm參數(shù),如-Xmx,-Xms等選項(xiàng)
注:
1.這兩個(gè)值應(yīng)該在A(yíng)M1和AM2之間
二、對(duì)于這些配置概念的理解
知道有這些參數(shù),還需理解其如何分配,下面我就一副圖讓大家更形象的了解各個(gè)參數(shù)的含義。
如上圖所示,先看最下面褐色部分,
AM參數(shù)mapreduce.map.memory.mb=1536MB,表示AM要為map?Container申請(qǐng)1536MB資源,但RM實(shí)際分配的內(nèi)存卻是2048MB,因?yàn)閥arn.scheduler.mininum-allocation-mb=1024MB,這定義了RM最小要分配1024MB,1536MB超過(guò)了這個(gè)值,所以實(shí)際分配給AM的值為2048MB(這涉及到了規(guī)整化因子,關(guān)于規(guī)整化因子,在本文最后有介紹)。
AM參數(shù)mapreduce.map.java.opts=-Xmx?1024m,表示運(yùn)行map任務(wù)的jvm內(nèi)存為1024MB,因?yàn)閙ap任務(wù)要運(yùn)行在Container里面,所以這個(gè)參數(shù)的值略微小于mapreduce.map.memory.mb=1536MB這個(gè)值。
NM參數(shù)yarn.nodemanager.vmem-pmem-radio=2.1,這表示NodeManager可以分配給map/reduce?Container?2.1倍的虛擬內(nèi)存,安照上面的配置,實(shí)際分配給map?Container容器的虛擬內(nèi)存大小為2048*2.1=3225.6MB,若實(shí)際用到的內(nèi)存超過(guò)這個(gè)值,NM就會(huì)kill掉這個(gè)map?Container,任務(wù)執(zhí)行過(guò)程就會(huì)出現(xiàn)異常。
AM參數(shù)mapreduce.reduce.memory.mb=3072MB,表示分配給reduce?Container的容器大小為3072MB,而map?Container的大小分配的是1536MB,從這也看出,reduce?Container容器的大小最好是map?Container大小的兩倍。
NM參數(shù)yarn.nodemanager.resource.mem.mb=24576MB,這個(gè)值表示節(jié)點(diǎn)分配給NodeManager的可用內(nèi)存,也就是節(jié)點(diǎn)用來(lái)執(zhí)行yarn任務(wù)的內(nèi)存大小。這個(gè)值要根據(jù)實(shí)際服務(wù)器內(nèi)存大小來(lái)配置,比如我們hadoop集群機(jī)器內(nèi)存是128GB,我們可以分配其中的80%給yarn,也就是102GB。
????上圖中RM的兩個(gè)參數(shù)分別1024MB和8192MB,分別表示分配給AM?map/reduce?Container的最大值和最小值。
三、關(guān)于任務(wù)提交過(guò)程
3.1?任務(wù)提交過(guò)程
步驟1:用戶(hù)將應(yīng)用程序提交到ResourceManager上;
步驟2:ResourceManager為應(yīng)用程序ApplicationMaster申請(qǐng)資源,并與某個(gè)NodeManager通信,以啟動(dòng)ApplicationMaster;
步驟3:ApplicationMaster與ResourceManager通信,為內(nèi)部要執(zhí)行的任務(wù)申請(qǐng)資源,一旦得到資源后,將于NodeManager通信,以啟動(dòng)對(duì)應(yīng)的任務(wù)。
步驟4:所有任務(wù)運(yùn)行完成后,ApplicationMaster向ResourceManager注銷(xiāo),整個(gè)應(yīng)用程序運(yùn)行結(jié)束。
?
3.2?關(guān)于Container
(1)?Container是YARN中資源的抽象,它封裝了某個(gè)節(jié)點(diǎn)上一定量的資源(CPU和內(nèi)存兩類(lèi)資源)。它跟Linux?Container沒(méi)有任何關(guān)系,僅僅是YARN提出的一個(gè)概念(從實(shí)現(xiàn)上看,可看做一個(gè)可序列化/反序列化的Java類(lèi))。
(2)??Container由ApplicationMaster向ResourceManager申請(qǐng)的,由ResouceManager中的資源調(diào)度器異步分配給ApplicationMaster;
(3)?Container的運(yùn)行是由ApplicationMaster向資源所在的NodeManager發(fā)起的,Container運(yùn)行時(shí)需提供內(nèi)部執(zhí)行的任務(wù)命令(可以使任何命令,比如java、Python、C++進(jìn)程啟動(dòng)命令均可)以及該命令執(zhí)行所需的環(huán)境變量和外部資源(比如詞典文件、可執(zhí)行文件、jar包等)。
另外,一個(gè)應(yīng)用程序所需的Container分為兩大類(lèi),如下:
(1)?運(yùn)行ApplicationMaster的Container:這是由ResourceManager(向內(nèi)部的資源調(diào)度器)申請(qǐng)和啟動(dòng)的,用戶(hù)提交應(yīng)用程序時(shí),可指定唯一的ApplicationMaster所需的資源;
(2)?運(yùn)行各類(lèi)任務(wù)的Container:這是由ApplicationMaster向ResourceManager申請(qǐng)的,并由ApplicationMaster與NodeManager通信以啟動(dòng)之。
以上兩類(lèi)Container可能在任意節(jié)點(diǎn)上,它們的位置通常而言是隨機(jī)的,即ApplicationMaster可能與它管理的任務(wù)運(yùn)行在一個(gè)節(jié)點(diǎn)上。
Container是YARN中最重要的概念之一,懂得該概念對(duì)于理解YARN的資源模型至關(guān)重要,望大家好好理解。
注意:如下圖,map/reduce?task是運(yùn)行在Container之中的,所以上面提到的mapreduce.map(reduce).memory.mb大小都大于mapreduce.map(reduce).java.opts值的大小。
?
四、HDP平臺(tái)參數(shù)調(diào)優(yōu)建議
根據(jù)上面介紹的相關(guān)知識(shí),我們就可以根據(jù)我們的實(shí)際情況作出相關(guān)參數(shù)的設(shè)置,當(dāng)然還需要在運(yùn)行測(cè)試過(guò)程中不斷檢驗(yàn)和調(diào)整。
以下是hortonworks給出的配置建議:
?http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.1.1/bk_installing_manually_book/content/rpm-chap1-11.html?
4.1 內(nèi)存分配
Reserved?Memory?=?Reserved?for?stack?memory?+?Reserved?for?HBase?Memory?(If?HBase?is?on?the?same?node)
系統(tǒng)總內(nèi)存126GB,預(yù)留給操作系統(tǒng)24GB,如果有Hbase再預(yù)留給Hbase24GB。
下面的計(jì)算假設(shè)Datanode節(jié)點(diǎn)部署了Hbase。
4.2containers?計(jì)算:
MIN_CONTAINER_SIZE?=?2048?MB
containers?=?min?(2*CORES,?1.8*DISKS,?(Total?available?RAM)?/?MIN_CONTAINER_SIZE)
#?of?containers?=?min?(2*12,?1.8*12,?(78?*?1024)?/?2048)
#?of?containers?=?min?(24,21.6,39)
#?of?containers?=?22
container?內(nèi)存計(jì)算:
RAM-per-container?=?max(MIN_CONTAINER_SIZE,?(Total?Available?RAM)?/?containers))
RAM-per-container?=?max(2048,?(78?*?1024)?/?22))
RAM-per-container?=?3630?MB
4.3Yarn?和?Mapreduce?參數(shù)配置:
yarn.nodemanager.resource.memory-mb?=?containers?*?RAM-per-container
yarn.scheduler.minimum-allocation-mb ?=?RAM-per-container
yarn.scheduler.maximum-allocation-mb ?=?containers?*?RAM-per-container
mapreduce.map.memory.mb ?????????=?RAM-per-container
mapreduce.reduce.memory.mb ?????=?2?*?RAM-per-container
mapreduce.map.java.opts ?????????=?0.8?*?RAM-per-container
mapreduce.reduce.java.opts ?????????=?0.8?*?2?*?RAM-per-container
yarn.nodemanager.resource.memory-mb =?22?*?3630?MB
yarn.scheduler.minimum-allocation-mb ????=?3630?MB
yarn.scheduler.maximum-allocation-mb??? =?22?*?3630?MB
mapreduce.map.memory.mb ????????????=?3630?MB
mapreduce.reduce.memory.mb ????????=?22?*?3630?MB
mapreduce.map.java.opts ????????????=?0.8?*?3630?MB
mapreduce.reduce.java.opts ????????????=?0.8?*?2?*?3630?MB
?
附:規(guī)整化因子介紹
??為了易于管理資源和調(diào)度資源,Hadoop?YARN內(nèi)置了資源規(guī)整化算法,它規(guī)定了最小可申請(qǐng)資源量、最大可申請(qǐng)資源量和資源規(guī)整化因子,如果應(yīng)用程序申請(qǐng)的資源量小于最小可申請(qǐng)資源量,則YARN會(huì)將其大小改為最小可申請(qǐng)量,也就是說(shuō),應(yīng)用程序獲得資源不會(huì)小于自己申請(qǐng)的資源,但也不一定相等;如果應(yīng)用程序申請(qǐng)的資源量大于最大可申請(qǐng)資源量,則會(huì)拋出異常,無(wú)法申請(qǐng)成功;規(guī)整化因子是用來(lái)規(guī)整化應(yīng)用程序資源的,應(yīng)用程序申請(qǐng)的資源如果不是該因子的整數(shù)倍,則將被修改為最小的整數(shù)倍對(duì)應(yīng)的值,公式為ceil(a/b)*b,其中a是應(yīng)用程序申請(qǐng)的資源,b為規(guī)整化因子。
????比如,在yarn-site.xml中設(shè)置,相關(guān)參數(shù)如下:
yarn.scheduler.minimum-allocation-mb:最小可申請(qǐng)內(nèi)存量,默認(rèn)是1024
yarn.scheduler.minimum-allocation-vcores:最小可申請(qǐng)CPU數(shù),默認(rèn)是1
yarn.scheduler.maximum-allocation-mb:最大可申請(qǐng)內(nèi)存量,默認(rèn)是8096
yarn.scheduler.maximum-allocation-vcores:最大可申請(qǐng)CPU數(shù),默認(rèn)是4
????對(duì)于規(guī)整化因子,不同調(diào)度器不同,具體如下:
FIFO和Capacity?Scheduler,規(guī)整化因子等于最小可申請(qǐng)資源量,不可單獨(dú)配置。
Fair?Scheduler:規(guī)整化因子通過(guò)參數(shù)yarn.scheduler.increment-allocation-mb和yarn.scheduler.increment-allocation-vcores設(shè)置,默認(rèn)是1024和1。
通過(guò)以上介紹可知,應(yīng)用程序申請(qǐng)到資源量可能大于資源申請(qǐng)的資源量,比如YARN的最小可申請(qǐng)資源內(nèi)存量為1024,規(guī)整因子是1024,如果一個(gè)應(yīng)用程序申請(qǐng)1500內(nèi)存,則會(huì)得到2048內(nèi)存,如果規(guī)整因子是512,則得到1536內(nèi)存。
注:轉(zhuǎn)載請(qǐng)說(shuō)明出處
本文原文鏈接:http://blog.csdn.net/suifeng3051/article/details/45477773?
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Yarn 内存分配管理机制及相关参数配置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python 之父退休,C 语言之父与世
- 下一篇: 如何领导团队做好技术债管理?