YARN和MapReduce的内存设置参考
如何确定Yarn中容器Container,Mapreduce相关参数的内存设置,对于初始集群,由于不知道集群的类型(如cpu密集、内存密集)我们需要根据经验提供给我们一个参考配置值,来作为基础的配置。
完成这一任务有两种方式,确定YARN和MapReduce的内存设置,我们可以使用HDP工具脚本进行内存配置设定
运行hdp-configuration-utils.py 这个Python脚本(下载地址:hdp-configuration-utils)来计算YARN、MapReduce需要的内存,执行以下命令
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 | 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 |
256GB | 32GB | 32GB |
512GB | 64GB | 64GB |
接下来我们计算决定每个节点允许的最大容器的数目,我们可以使用下列公式:
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-site.xml | yarn.scheduler.minimum-allocationmb | = RAM-per-container |
yarn-site.xml | yarn.scheduler.maximum-allocationmb | =containers*RAM-per-container |
mapred-site.xml | mapreduce.map.memory.mb | = RAM-per-container |
mapred-site.xml | mapreduce.reduce.memory.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 |
mapred-site.xml | yarn.app.mapreduce.am.resource.mb | = 2 * RAM-per-container |
mapred-site.xml | yarn.app.mapreduce.am.commandopts | = 0.8 * 2 * RAM-per-container |
注:在安装好后,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 | = 21 * 2 = 42*1024 MB |
mapreduce.map.memory.mb | = 2*1024 MB |
mapreduce.reduce.memory.mb | = 2 * 2 = 4*1024 MB |
mapreduce.map.java.opts | = 0.8 * 2 = 1.6*1024 MB |
mapreduce.reduce.java.opts | = 2 * 2 = 4*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
根据此时的值计算出来的值
配置 | 计算值 |
yarn.nodemanager.resource.memory-mb | =17*2=34*1024MB |
yarn.scheduler.minimum-allocation-mb | = 2*1024 MB |
yarn.scheduler.maximum-allocation-mb | = 17 * 2 = 34*1024 MB |
mapreduce.map.memory.mb | = 2*1024 MB |
mapreduce.reduce.memory.mb | = 2 * 2 = 4*1024 MB |
mapreduce.map.java.opts | = 0.8 * 2 = 1.6*1024 MB |
mapreduce.reduce.java.opts | = 0.8 * 2 * 2 = 3.2*1024 MB |
yarn.app.mapreduce.am.resource.mb | = 2 * 2 = 4*1024 MB |
yarn.app.mapreduce.am.command-opts | = 0.8 * 2 * 2 = 3.2*1024 MB |
备注:
1.更新属性值yarn.scheduler.minimum-allocation-mb要同时更新
yarn.nodemanager.resource.memory-mb 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 | 3072m |
50-70 | 33536m | 4352m |
70-100 | 47872m | 6144m |
100-125 | 71424m | 8960m |
150-200 | 94976m | 8960m |
我们应该设置-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