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