YARN的內存和CPU配置

Hadoop YARN同時支持內存和CPU兩種資源的調度,本文介紹如何配置YARN對內存和CPU的使用。php

YARN做爲一個資源調度器,應該考慮到集羣裏面每一臺機子的計算資源,而後根據application申請的資源進行分配Container。Container是YARN裏面資源分配的基本單位,具備必定的內存以及CPU資源。html

在YARN集羣中,平衡內存、CPU、磁盤的資源的很重要的,根據經驗,每兩個container使用一塊磁盤以及一個CPU核的時候可使集羣的資源獲得一個比較好的利用。java

內存配置

關於 內存 相關的配置能夠參考hortonwork公司的文檔 Determine HDP Memory Configuration Settings 來配置你的集羣。node

YARN以及MAPREDUCE全部可用的內存資源應該要除去系統運行須要的以及其餘的hadoop的一些程序,總共保留的內存=系統內存+HBASE內存。python

能夠參考下面的表格肯定應該保留的內存:app

每臺機子內存 系統須要的內存 HBase須要的內存
4GB 1GB 1GB
8GB 2GB 1GB
16GB 2GB 2GB
24GB 4GB 4GB
48GB 6GB 8GB
64GB 8GB 8GB
72GB 8GB 8GB
96GB 12GB 16GB
128GB 24GB 24GB
255GB 32GB 32GB
512GB 64GB 64GB

計算每臺機子最多能夠擁有多少個container,可使用下面的公式:oop

containers = min (2*CORES, 1.8*DISKS, (Total available RAM) / MIN_CONTAINER_SIZE)性能

說明:測試

  • CORES 爲機器CPU核數
  • DISKS 爲機器上掛載的磁盤個數
  • Total available RAM 爲機器總內存
  • MIN_CONTAINER_SIZE 是指container最小的容量大小,這須要根據具體狀況去設置,能夠參考下面的表格:
每臺機子可用的RAM container最小值
小於4GB 256MB
4GB到8GB之間 512MB
8GB到24GB之間 1024MB
大於24GB 2048MB

每一個container的平均使用內存大小計算方式爲:ui

RAM-per-container = max(MIN_CONTAINER_SIZE, (Total Available RAM) / containers))

經過上面的計算,YARN以及MAPREDUCE能夠這樣配置:

配置文件 配置設置 默認值 計算值
yarn-site.xml yarn.nodemanager.resource.memory-mb 8192 MB = containers * RAM-per-container
yarn-site.xml yarn.scheduler.minimum-allocation-mb 1024MB = RAM-per-container
yarn-site.xml yarn.scheduler.maximum-allocation-mb 8192 MB = containers * RAM-per-container
yarn-site.xml (check) yarn.app.mapreduce.am.resource.mb 1536 MB = 2 * RAM-per-container
yarn-site.xml (check) yarn.app.mapreduce.am.command-opts -Xmx1024m = 0.8 * 2 * RAM-per-container
mapred-site.xml mapreduce.map.memory.mb 1024 MB = RAM-per-container
mapred-site.xml mapreduce.reduce.memory.mb 1024 MB = 2 * RAM-per-container
mapred-site.xml mapreduce.map.java.opts   = 0.8 * RAM-per-container
mapred-site.xml mapreduce.reduce.java.opts   = 0.8 * 2 * RAM-per-container

舉個例子:對於128G內存、32核CPU的機器,掛載了7個磁盤,根據上面的說明,系統保留內存爲24G,不適應HBase狀況下,系統剩餘可用內存爲104G,計算containers值以下:

containers = min (2*32, 1.8* 7 , (128-24)/2) = min (64, 12.6 , 51) = 13

計算RAM-per-container值以下:

RAM-per-container = max (2, (124-24)/13) = max (2, 8) = 8

這樣集羣中下面的參數配置值以下:

配置文件 配置設置 計算值
yarn-site.xml yarn.nodemanager.resource.memory-mb = 13 * 8 =104 G
yarn-site.xml yarn.scheduler.minimum-allocation-mb = 8G
yarn-site.xml yarn.scheduler.maximum-allocation-mb = 13 * 8 = 104G
yarn-site.xml (check) yarn.app.mapreduce.am.resource.mb = 2 * 8=16G
yarn-site.xml (check) yarn.app.mapreduce.am.command-opts = 0.8 * 2 * 8=12.8G
mapred-site.xml mapreduce.map.memory.mb = 8G
mapred-site.xml mapreduce.reduce.memory.mb = 2 * 8=16G
mapred-site.xml mapreduce.map.java.opts = 0.8 * 8=6.4G
mapred-site.xml mapreduce.reduce.java.opts = 0.8 * 2 * 8=12.8G

你也可使用腳本 yarn-utils.py 來計算上面的值:

python yarn-utils.py -c 32 -m 128 -d 7 -k False 

返回結果以下:

Using cores=32 memory=128GB disks=7 hbase=False Profile: cores=32 memory=106496MB reserved=24GB usableMem=104GB disks=7 Num Container=13 Container Ram=8192MB Used Ram=104GB Unused Ram=24GB yarn.scheduler.minimum-allocation-mb=8192 yarn.scheduler.maximum-allocation-mb=106496 yarn.nodemanager.resource.memory-mb=106496 mapreduce.map.memory.mb=8192 mapreduce.map.java.opts=-Xmx6553m mapreduce.reduce.memory.mb=8192 mapreduce.reduce.java.opts=-Xmx6553m yarn.app.mapreduce.am.resource.mb=8192 yarn.app.mapreduce.am.command-opts=-Xmx6553m mapreduce.task.io.sort.mb=3276 

對應的xml配置爲:

<property>  <name>yarn.nodemanager.resource.memory-mb</name>  <value>106496</value> </property> <property>  <name>yarn.scheduler.minimum-allocation-mb</name>  <value>8192</value> </property> <property>  <name>yarn.scheduler.maximum-allocation-mb</name>  <value>106496</value> </property> <property>  <name>yarn.app.mapreduce.am.resource.mb</name>  <value>8192</value> </property> <property>  <name>yarn.app.mapreduce.am.command-opts</name>  <value>-Xmx6553m</value> </property> 

另外,還有一下幾個參數:

  • yarn.nodemanager.vmem-pmem-ratio :任務每使用1MB物理內存,最多可以使用虛擬內存量,默認是2.1。
  • yarn.nodemanager.pmem-check-enabled :是否啓動一個線程檢查每一個任務正使用的物理內存量,若是任務超出分配值,則直接將其殺掉,默認是true。
  • yarn.nodemanager.vmem-pmem-ratio :是否啓動一個線程檢查每一個任務正使用的虛擬內存量,若是任務超出分配值,則直接將其殺掉,默認是true。

第一個參數的意思是當一個map任務總共分配的物理內存爲8G的時候,該任務的container最多內分配的堆內存爲6.4G,能夠分配的虛擬內存上限爲8*2.1=16.8G。另外,照這樣算下去,每一個節點上YARN能夠啓動的Map數爲104/8=13個,彷佛偏少了,這主要是和咱們掛載的磁盤數太少了有關,人爲的調整 RAM-per-container 的值爲4G或者更小的一個值是否更合理呢?固然,這個要監控集羣實際運行狀況來決定了。

CPU配置

YARN中目前的CPU被劃分紅虛擬CPU(CPU virtual Core),這裏的虛擬CPU是YARN本身引入的概念,初衷是,考慮到不一樣節點的CPU性能可能不一樣,每一個CPU具備的計算能力也是不同的,好比某個物理CPU的計算能力多是另一個物理CPU的2倍,這時候,你能夠經過爲第一個物理CPU多配置幾個虛擬CPU彌補這種差別。用戶提交做業時,能夠指定每一個任務須要的虛擬CPU個數。

在YARN中,CPU相關配置參數以下:

  • yarn.nodemanager.resource.cpu-vcores :表示該節點上YARN可以使用的虛擬CPU個數,默認是8,注意,目前推薦將該值設值爲與物理CPU核數數目相同。若是你的節點CPU核數不夠8個,則須要調減少這個值,而YARN不會智能的探測節點的物理CPU總數。
  • yarn.scheduler.minimum-allocation-vcores :單個任務可申請的最小虛擬CPU個數,默認是1,若是一個任務申請的CPU個數少於該數,則該對應的值改成這個數。
  • yarn.scheduler.maximum-allocation-vcores :單個任務可申請的最多虛擬CPU個數,默認是32。

對於一個CPU核數較多的集羣來講,上面的默認配置顯然是不合適的,在個人測試集羣中,4個節點每一個機器CPU核數爲32,能夠配置爲:

<property>  <name>yarn.nodemanager.resource.cpu-vcores</name>  <value>32</value> </property> <property>  <name>yarn.scheduler.maximum-allocation-vcores</name>  <value>128</value> </property> 

總結

根據上面的說明,個人測試集羣中集羣節點指標以下:

每一個節點分配的物理內存、虛擬內存和CPU核數以下:

實際生產環境中,可能不會像上面那樣設置,好比不會把全部節點的CPU核數都分配給Spark,須要保留一個核留給系統使用;另外,內存上限也會作些設置。

相關文章
相關標籤/搜索