天天看點

Yarn 記憶體配置設定管理機制及相關參數配置

關于yarn記憶體配置設定與管理,主要涉及到了resourcemanage、applicationmatser、nodemanager這幾個概念,相關的優化也要緊緊圍繞着這幾方面來開展。這裡還有一個container的概念,現在可以先把它了解為運作map/reduce task的容器,後面有詳細介紹。

<code>rm1:yarn.scheduler.minimum-allocation-mb</code> 配置設定給am單個容器可申請的最小記憶體

<code>rm2:yarn.scheduler.maximum-allocation-mb</code> 配置設定給am單個容器可申請的最大記憶體

注:

最小值可以計算一個節點最大container數量

一旦設定,不可動态改變

<code>nm1:yarn.nodemanager.resource.memory-mb</code> 節點最大可用記憶體

<code>nm2:yarn.nodemanager.vmem-pmem-ratio</code> 虛拟記憶體率,預設2.1

rm1、rm2的值均不能大于nm1的值

nm1可以計算節點最大最大container數量,max(container)=nm1/rm1

<code>am1:mapreduce.map.memory.mb</code> 配置設定給map container的記憶體大小

<code>am2:mapreduce.reduce.memory.mb</code> 配置設定給reduce container的記憶體大小

這兩個值應該在rm1和rm2這兩個值之間

am2的值最好為am1的兩倍

這兩個值可以在啟動時改變

<code>am3:mapreduce.map.java.opts</code> 運作map任務的jvm參數,如-xmx,-xms等選項

<code>am4:mapreduce.reduce.java.opts</code> 運作reduce任務的jvm參數,如-xmx,-xms等選項

這兩個值應該在am1和am2之間

知道有這些參數,還需了解其如何配置設定,下面我就一副圖讓大家更形象的了解各個參數的含義。

Yarn 記憶體配置設定管理機制及相關參數配置

如上圖所示,先看最下面褐色部分,

am參數<code>mapreduce.map.memory.mb=1536mb</code>,表示am要為map container申請1536mb資源,但rm實際配置設定的記憶體卻是2048mb,因為<code>yarn.scheduler.mininum-allocation-mb=1024mb</code>,這定義了rm最小要配置設定1024mb,1536mb超過了這個值,是以實際配置設定給am的值為2048mb(這涉及到了規整化因子,關于規整化因子,在本文最後有介紹)。

am參數<code>mapreduce.map.java.opts=-xmx 1024m</code>,表示運作map任務的jvm記憶體為1024mb,因為map任務要運作在container裡面,是以這個參數的值略微小于<code>mapreduce.map.memory.mb=1536mb</code>這個值。

nm參數<code>yarn.nodemanager.vmem-pmem-radio=2.1</code>,這表示nodemanager可以配置設定給map/reduce container 2.1倍的虛拟記憶體,安照上面的配置,實際配置設定給map container容器的虛拟記憶體大小為2048*2.1=3225.6mb,若實際用到的記憶體超過這個值,nm就會kill掉這個map container,任務執行過程就會出現異常。

am參數<code>mapreduce.reduce.memory.mb=3072mb</code>,表示配置設定給reduce container的容器大小為3072mb,而map container的大小配置設定的是1536mb,從這也看出,reduce container容器的大小最好是map container大小的兩倍。

nm參數<code>yarn.nodemanager.resource.mem.mb=24576mb</code>,這個值表示節點配置設定給nodemanager的可用記憶體,也就是節點用來執行yarn任務的記憶體大小。這個值要根據實際伺服器記憶體大小來配置,比如我們hadoop叢集機器記憶體是128gb,我們可以配置設定其中的80%給yarn,也就是102gb。

上圖中rm的兩個參數分别1024mb和8192mb,分别表示配置設定給am map/reduce container的最大值和最小值。

步驟1:使用者将應用程式送出到resourcemanager上;

步驟2:resourcemanager為應用程式applicationmaster申請資源,并與某個nodemanager通信,以啟動applicationmaster;

步驟3:applicationmaster與resourcemanager通信,為内部要執行的任務申請資源,一旦得到資源後,将于nodemanager通信,以啟動對應的任務。

步驟4:所有任務運作完成後,applicationmaster向resourcemanager登出,整個應用程式運作結束。

Yarn 記憶體配置設定管理機制及相關參數配置

(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值的大小。

Yarn 記憶體配置設定管理機制及相關參數配置

根據上面介紹的相關知識,我們就可以根據我們的實際情況作出相關參數的設定,當然還需要在運作測試過程中不斷檢驗和調整。

以下是hortonworks給出的配置建議:

<a href="http://docs.hortonworks.com/hdpdocuments/hdp2/hdp-2.1.1/bk_installing_manually_book/content/rpm-chap1-11.html">http://docs.hortonworks.com/hdpdocuments/hdp2/hdp-2.1.1/bk_installing_manually_book/content/rpm-chap1-11.html</a>

reserved memory = reserved for stack memory + reserved for hbase memory (if hbase is on the same node)

系統總記憶體126gb,預留給作業系統24gb,如果有hbase再預留給hbase24gb。

下面的計算假設datanode節點部署了hbase。

container 記憶體計算:

附:規整化因子介紹

為了易于管理資源和排程資源,hadoop yarn内置了資源規整化算法,它規定了最小可申請資源量、最大可申請資源量和資源規整化因子,如果應用程式申請的資源量小于最小可申請資源量,則yarn會将其大小改為最小可申請量,也就是說,應用程式獲得資源不會小于自己申請的資源,但也不一定相等;如果應用程式申請的資源量大于最大可申請資源量,則會抛出異常,無法申請成功;規整化因子是用來規整化應用程式資源的,應用程式申請的資源如果不是該因子的整數倍,則将被修改為最小的整數倍對應的值,公式為ceil(a/b)*b,其中a是應用程式申請的資源,b為規整化因子。

比如,在yarn-site.xml中設定,相關參數如下:

對于規整化因子,不同排程器不同,具體如下:

fifo和capacity scheduler,規整化因子等于最小可申請資源量,不可單獨配置。

fair scheduler:規整化因子通過參數<code>yarn.scheduler.increment-allocation-mb</code>和<code>yarn.scheduler.increment-allocation-vcores</code>設定,預設是1024和1。

通過以上介紹可知,應用程式申請到資源量可能大于資源申請的資源量,比如yarn的最小可申請資源記憶體量為1024,規整因子是1024,如果一個應用程式申請1500記憶體,則會得到2048記憶體,如果規整因子是512,則得到1536記憶體。