如何确定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