1. 程式人生 > >Yarn 內存分配管理機制及相關參數配置

Yarn 內存分配管理機制及相關參數配置

系統 如果 ast nod java類 其中 指定 XML sam

上一篇hive on tez 任務報錯中提到了containter內存不足,現對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單個容器可申請的最大內存
註:

  • 最小值可以計算一個節點最大Container數量
  • 一旦設置,不可動態改變

1.2 NM的內存資源配置,配置的是硬件資源相關

NM1:yarn.nodemanager.resource.memory-mb 節點最大可用內存
NM2:yarn.nodemanager.vmem-pmem-ratio 虛擬內存率,默認2.1
註:

  • RM1、RM2的值均不能大於NM1的值
  • NM1可以計算節點最大最大Container數量,max(Container)=NM1/RM1
  • 一旦設置,不可動態改變

1.3 AM內存配置相關參數,配置的是任務相關

AM1:mapreduce.map.memory.mb

分配給map Container的內存大小
AM2:mapreduce.reduce.memory.mb 分配給reduce Container的內存大小

  • 這兩個值應該在RM1和RM2這兩個值之間
  • AM2的值最好為AM1的兩倍
  • 這兩個值可以在啟動時改變

AM3:mapreduce.map.java.opts 運行map任務的jvm參數,如-Xmx,-Xms等選項
AM4:mapreduce.reduce.java.opts 運行reduce任務的jvm參數,如-Xmx,-Xms等選項
註:

  • 這兩個值應該在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-mbyarn.scheduler.increment-allocation-vcores設置,默認是1024和1。
通過以上介紹可知,應用程序申請到資源量可能大於資源申請的資源量,比如YARN的最小可申請資源內存量為1024,規整因子是1024,如果一個應用程序申請1500內存,則會得到2048內存,如果規整因子是512,則得到1536內存。

Yarn 內存分配管理機制及相關參數配置