YARN的內存和CPU配置

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

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

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

內存配置

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

YARN以及MAPREDUCE所有可用的內存資源應該要除去系統運行需要的以及其他的hadoop的一些程序,總共保留的內存=系統內存+HBASE內存。

可以參考下面的表格確定應該保留的內存:

每臺機子內存 系統需要的內存 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,可以使用下面的公式:

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的平均使用內存大小計算方式爲:

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,需要保留一個核留給系統使用;另外,內存上限也會做些設置。

原文地址:

http://www.tuicool.com/articles/Zr6RVr

發佈了43 篇原創文章 · 獲贊 6 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章