如何确定Yarn中容器Container,Mapreduce相關參數的記憶體設定,對于初始叢集,由于不知道叢集的類型(如cpu密集、記憶體密集)我們需要根據經驗提供給我們一個參考配置值,來作為基礎的配置。
完成這一任務有兩種方式,确定YARN和MapReduce的記憶體設定,我們可以使用HDP工具腳本進行記憶體配置設定
python hdp-configuration-utils.py options
其中可選項如下:
選項
描述
-c CORES
每一個客戶機的核數目
-m MEMORY
每一個客戶機擁有的記憶體總數
-d DISK
每一個客戶機擁有的磁盤數目
-k HBASE
如果Hbase安裝了為”True”,否則為”False”
注:需要python26的運作環境
我們可以使用-h或-help來顯示描述選項的幫助資訊。
例子
運作下面的指令
python hdp-configuration-utils.py -c 16 -m 64 -d 4 -k True
結果如下:

手動計算YARN和MapReduce記憶體配置設定
接下來我們将描述如何基于特定的硬體,手工的設定YARN和MapReduce記憶體。
YARN可以考慮叢集中所有節點的可用的計算機資源。基于可用的資源,YARN會溝通協調應用程式(如:mapReduce)需要的資源。YARN會為每一個應用提供相應的容器Container。容器Container是YARN的基本處理單元,是記憶體和CPU資源的一種封裝。
在Hadoop叢集中,平衡記憶體RAM、處理器cpu和磁盤的使用是非常重要的。作為一般的推薦,為每個磁盤和每個核配置設定兩個容器,為叢集的使用率提供了最好的平衡。
當為一個叢集決定合适的YARN和MapReduce記憶體設定時,從可用的硬體資源開始,注意每個節點的以下值:
RAM(記憶體的數量)
CORES(CPU的核數)
DISKS(磁盤的數目)
整個針對YARN和MapReduce可用的RAM數,應該考慮預留的記憶體。預留的記憶體主要用于系統程序占用和其它Hadoop程序(如Hbase)。
預留的記憶體=保留棧記憶體+Hbase預留記憶體(如果Hbase是部署在同一台機器上)
我們通常會使用下表來決定預留記憶體的大小
每個節點的總記憶體
推薦系統保留的記憶體
推薦為hbase保留的記憶體
4GB
1GB
8GB
2GB
16GB
24GB
48GB
6GB
64GB
72GB
96GB
12GB
128GB
256GB
32GB
512GB
接下來我們計算決定每個節點允許的最大容器的數目,我們可以使用下列公式:
containers = min (2*CORES, 1.8*DISKS, (Total available RAM) /MIN_CONTAINER_SIZE)
其中DISKS是參數每台機器中dfs.data.dirs參數的數目值。MIN_CONTAINER_SIZE是最小的容器大小(RAM)。這個值是依賴于RAM的可用數目——小的記憶體節點,最小的容器大小應該更小。
容器推薦值
推薦的最小容器大小
小于4GB
256MB
在4GB和8GB之間
512MB
在8GB和24GB
1024MB
大于24GB
20148MB
最終的計算結果決定了每個容器的RAM的數目。
RAM-per-container = max(MIN_CONTAINER_SIZE, (Total Available RAM) / containers))
因為這些計算,YARN和MapReduce設定如下
配置檔案
配置設定
計算值
Yarn-site.xml
yarn.nodemanager.resource.memorymb
=containers*RAM-per-container
yarn.scheduler.minimum-allocationmb
= RAM-per-container
yarn-site.xml
yarn.scheduler.maximum-allocationmb
mapred-site.xml
mapreduce.map.memory.mb
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.app.mapreduce.am.resource.mb
yarn.app.mapreduce.am.commandopts
注:在安裝好後,yarn-site.xml and mapred-site.xml位于檔案夾/etc/Hadoop/conf目錄
舉例說明:
叢集節點擁有12個CPU核,48GB記憶體和12塊磁盤
保留記憶體(Reserved Memory)=6GB系統預留記憶體+(如果有Hbase)8GB的Hbase記憶體
最小的容器大小(Min container size)=2GB
含有的容器數(containers)=min(2*12,1.8*12,(48-6)/2)=min(24,21.6,21)=21
每個容器的RAM(RAM-per-container)=max(2,(48-6)/21)=max(2,2)=2
根據上述例子計算出來的值
配置
yarn.nodemanager.resource.memory-mb
= 21 * 2 = 42*1024 MB
yarn.scheduler.minimum-allocation-mb
= 2*1024 MB
yarn.scheduler.maximum-allocation-mb
= 2 * 2 = 4*1024 MB
= 0.8 * 2 = 1.6*1024 MB
yarn.app.mapreduce.am.command-opts
= 0.8 * 2 * 2 = 3.2*1024 MB
如果部署了HBase
容器數目(containers)=min(2*12,1.8*12,(48-6-8)/2)=min(24,21.6,17)=17
每個容器的RAM(RAM-per-container)=max(2,(48-6-8)/17)=max(2,2)=2
根據此時的值計算出來的值
=17*2=34*1024MB
= 17 * 2 = 34*1024 MB
備注:
1.更新屬性值yarn.scheduler.minimum-allocation-mb要同時更新
導緻每個節點容器數目的改變。
2.如果你安裝擁有很大數目的記憶體,而缺少磁盤和CPU核,你可以将記憶體釋放給其它的任務,降低參數yarn.scheduler.minimum-allocation-mb
andyarn.nodemanager.resource.memory-mb的值
3.目前在YARN上運作MapReduce時。我們不在會去設定靜态的Map和Reduce任務。整個叢集将根據Job的需要動态的配置設定Map和Reduce任務。在我們的叢集中,YARN可以在每個節點上配置設定10個Map和5個Reduce。
設定NameNode的對記憶體大小
NameNode的堆大小受很多的因數影響如檔案的數目,塊的數目和系統的負載。下面的表格提供了NameNode對大小的設定。這些設定經常用于典型的Hadoop叢集,其中塊的數目和檔案的數目十分接近(一般而言,系統中平均每個檔案的塊數比例大概在1.1到1.2),總的來說将NameNode的堆記憶體設定的越大越好。
檔案的數目(百萬)
整個java的堆(Xmx和Xms)
年輕代大小
(-XX:NewSize-XX:MaxNewSize)
<1 million files
1024m
128m
1-5million files
3072m
512m
5-10
5376m
768m
10-20
9984m
1280m
20-30
14848m
2048m
30-40
19456m
2560m
40-50
24320m
50-70
33536m
4352m
70-100
47872m
6144m
100-125
71424m
8960m
150-200
94976m
我們應該設定-XX:PermSize為128m –XX:maxPermSize為256m
下面是對Hadoop_NameNode_Opts參數的推薦設定,在配置檔案hadoop-env.sh中(将下面的####替換成-XX:NewSize,-XX:MaxNewSize,-Xms,和-Xmx可以用上上面表中推薦的值)
-XX:+HeapDumpOnOutOfMemoryError這個參數指明了當記憶體錯誤出現時,堆的dump操作将會被執行。你也可以使用-XX:HeapDumpPath來指定heap dump檔案的位置,如:另外一個有用的HADOOP_NAMENODE_OPTS參數是
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./etc/heapdump.hprof
參考:http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.1.1/bk_installing_manually_book/content/rpm-chap1-11.html
http://blog.csdn.net/suifeng3051/article/details/45477773