YARN作为资源调度管理组件,对YARN的的优化主要呈现在CPU和内存两方面
1.内存篇
在YARN集群中,平衡内存,CPU和磁盘的资源是比较重要的.一般来说,每两个Container使用一块磁盘和一个CPU核可以是使资源得到比较充分的利用
对YARN而言的内存可用资源,是指在排除操作系统或其它应用程序占用之外剩下的部分,才是可用资源
可以参考如下表格:
每台机器的内存 | 系统需要的内存 | HBASE需要的内存 |
4G | 1G | 1G |
8GB | 2G | 1G |
16G | 2G | 2G |
24G | 4G | 4G |
48G | 6G | 8G |
64G | 8G | 8G |
72G | 8G | 8G |
96GB | 12GB | 16GB |
128GB | 24GB | 24GB |
255GB | 32GB | 32GB |
512GB | 64GB | 64GB |
计算每台机器最多可以拥有多少个Container,可以使用下面的公式:
containers = min (2*机器CPU核数, 1.8*机器上挂载的磁盘个数, (机器总内存) / MIN_CONTAINER_SIZE)
说明: MIN_CONTAINER_SIZE是指container最小的容量大小,这需要根据具体情况去设置,可以参考下面的表格
每台机器可用的内存 | Container最小值 |
小于4GB | 256MB |
4GB到8GB之间 | 512MB |
8GB到24GB之间 | 1024MB |
大于24GB | 2048MB |
根据上面的计算后,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的情况下,可以认为YARN的可用资源为104G
可用资源104G,计算Container最大值为13个 <= min (2*32, 1.8* 7 , (128-24)/2) = min (64, 12.6 , 51) = 13
每个Container平均内存大小为8G <=max (2, (124-24)/13) = max (2, 8) = 8
可以支持平均8G,明显有点偏大(浪费)了,既然可以支持到平均8G,那就继续设置,降为2G,这样可以产生的更多的Container
配置文件 | 配置设置 | 计算值 |
yarn-site.xml | yarn.nodemanager.resource.memory-mb | = 52 * 2 =104 G |
yarn-site.xml | yarn.scheduler.minimum-allocation-mb | = 2G |
yarn-site.xml | yarn.scheduler.maximum-allocation-mb | = 52 * 2 = 104G |
yarn-site.xml (check) | yarn.app.mapreduce.am.resource.mb | = 2 * 2=4G |
yarn-site.xml (check) | yarn.app.mapreduce.am.command-opts | = 0.8 * 2 * 2=3.2G |
mapred-site.xml | mapreduce.map.memory.mb | = 2G |
mapred-site.xml | mapreduce.reduce.memory.mb | = 2 * 2=4G |
mapred-site.xml | mapreduce.map.java.opts | = 0.8 * 2=1.6G |
mapred-site.xml | mapreduce.reduce.java.opts | = 0.8 * 2 * 2=3.2G |
另外还有几个参数:
yarn.nodemanager.vmem-pmem-ratio:任务每使用1MB物理内存,最多可使用虚拟内存量,默认是2.1
yarn.nodemanager.pmem-check-enabled:是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true
yarn.nodemanager.vmem-pmem-ratio:是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true
第一个参数的意思是当一个map任务总共分配的物理内存为2G的时候,该任务的container最多内分配的堆内存为1.6G,可以分配的虚拟内存上限为2*2.1=4.2G。
照这样算下去,每个节点上YARN可以启动的Map数为104/2=52个
2.CPU篇
相较内存的设置,CPU的要简单的多.因为YARN中引入了一个虚拟CPU的概念,YARN中的核都是指虚拟CPU.它的设计初衷是表述不同的CPU之间的计算能力差异.
比如一个高性能CPU的计算能力是另一种便宜版的两倍,就可以在高性能这边设置1:2的物理虚拟核比.
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
这些默认值在实际生产集群中是不合适,生产集群一般都是高核服务器,这里应该以自己的集群重新调试参数.(比如一般的32核服务器,就要设置为31核,留一个操作系统)
3.调度器优化
详见 YARN调度器篇
参考: http://blog.itpub.net/30089851/viewspace-2127851/