在YARN集群中,平衡内存、CPU、磁盘的资源的很重要的。根据经验,每两个container使用一块磁盘以及一个CPU核的时候可以使集群的资源得到一个比较好的利用。
内存配置
YARN所有可用的内存资源应该要减去系统预留内存、各个进程内存的经验值。
即:总共保留的内存=系统内存+各个进程内存的经验值。
Hbase 、系统需要的内存(一般留总内存的20%左右)参考:
每台机子内存 | 系统需要的内存 | 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 |
RM/NN 、DN/NM内存的经验值参考:
生产情况,DN和NM也是部署在一台机器上的,目的:数据本地化,减少网络IO,经验值推荐各分配4G 。
生产情况,NN和RM一般是部署在一台机器上的,一般分配8个G的内存,根据集群规模可适当调大。
hadoop-env.sh
# NN内存
HADOOP_NAMENODE_OPTS=-Xmx1000m(默认)
HADOOP_NAMENODE_OPTS=-Xmx8192m(建议8G)
# DN内存
HADOOP_DATANODE_OPTS=-Xmx1000m(默认)
HADOOP_DATANODE_OPTS=-Xmx4096m(建议4G)
yarn-env.sh
# RM内存
export YARN_RESOURCEMANAGER_HEAPSIZE=1000(默认)
export YARN_RESOURCEMANAGER_HEAPSIZE=8192(建议8G)
# NM内存
export YARN_NODEMANAGER_HEAPSIZE=1000(默认)
export YARN_NODEMANAGER_HEAPSIZE=4096(建议4G)
剩下的可用内存,配到 yarn.nodemanager.resource.memory-mb 中 ,可向系统借一些,也可以看情况减少些。
container内存的最小值(yarn.scheduler.minimum-allocation-mb)可以参考以下表格,可根据生产作业大小情况适当调整:
每台机子可用的RAM | container最小值 |
---|---|
小于4GB | 256MB |
4GB到8GB之间 | 512MB |
8GB到24GB之间 | 1024MB |
24GB到128G之间 | 2048MB |
128G以上 | 4096MB |
container内存的最大值(yarn.scheduler.maximum-allocation-mb)配置原则:
yarn可用内存 / container内存的最大值 = 整数
方案1:可设置成和yarn.nodemanager.resource.memory-mb相同(生产上作业比较大的时候)
方案2:根据生产上的作业大小的最值情况定一个合适的值(必须满足原则)
另外,还有以下几个关于container OOM (out of memory)是否主动kill配置:
#任务可使用的物理内存和虚拟内存量的比值,默认是2.1,即 物理内存:虚拟内存 = 1:2.1,表示1M的物理内存,对应2.1M的虚拟内存。
yarn.nodemanager.vmem-pmem-ratio
#是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true。
yarn.nodemanager.pmem-check-enabled:
#是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是false。
yarn.nodemanager.vmem-check-enabled
内存配置案例
物理内存 48 G:
系统预留: 48G * 20% = 9.6G (查表为6G)
dn、rm : 4+4 =8G
可用内存: 48 - 9.6 -8 = 30.2G (可向预留借,凑成32G。 也可减成30G。这里凑到32G)
yarn-site.xml
# container总内存
yarn.nodemanager.resource.memory-mb 32 * 1024
# 单个container最小内存
yarn.scheduler.minimum-allocation-mb 2048 (查表得)
# 单个container最大内存
yarn.scheduler.maximum-allocation-mb 32 * 1024 (方案1,作业大时)
yarn.scheduler.maximum-allocation-mb 8 * 1024 (方案2,8g一般够用,根据具体情况调整)
按照方案一。 在内存不空闲的前提下,理论container数应该是: 32/2 = 16 32/32 = 1 ===> 1—16 个
按照方案二。 在内存不空闲的前提下,理论container数应该是: 32/2 = 16 32/8 = 4 ===> 4—16 个
生产例子 :
yarn.nodemanager.resource.memory-mb 168G
yarn.scheduler.minimum-allocation-mb 4G
yarn.scheduler.maximum-allocation-mb 24G
CPU配置
YARN中目前的CPU被划分成虚拟CPU(CPU virtual Core),这里的虚拟CPU是YARN自己引入的概念,初衷是,考虑到不同节点的CPU性能可能不同,可以通过为第一个物理CPU多配置几个虚拟CPU弥补这种差异。用户提交作业时,可以指定每个任务需要的虚拟CPU个数。
yarn.nodemanager.resource.pcores-vcores-multiplier(新版本参数) 物理core : vcore 的值。 默认是 1 (老版本没有这个参数, 默认是 2 。 即pcore : vcore = 1 : 2 )
CPU相关配置参数如下:
- yarn.nodemanager.resource.cpu-vcores:表示该节点上YARN可使用的vcore个数,默认是8。
- yarn.scheduler.minimum-allocation-vcores:单个任务可申请的最小core个数,默认是1。
- yarn.scheduler.maximum-allocation-vcores:单个任务可申请的最多虚拟CPU个数,默认是4。
一般yarn.nodemanager.resource.cpu-vcores按照当前总vcore*80%,不要把所有的vcore拿过来用
假设节点vcore为16 个,则:
yarn.nodemanager.resource.cpu-vcores : 一般分vcore总数的 80% 。 16*0.8 ≈ 12 。该值设为12 。
yarn-site.xml
# 每个容器可以使用的最小vcore
yarn.scheduler.minimum-allocation-vcores 1
# 每个contailer可以使用的最大vcore
yarn.scheduler.maximum-allocation-vcores 4
在可用内存不空闲的前提下,理论container数应该是: 32/2 = 16 32/8 = 4 ===> 4—16 个
在可用cpu不空闲的前提下,理论container数应该是: 12/4 = 3 12/1 = 12 ===> 3—12 个
综合考虑也会造成一定的资源浪费, 所以在正式调优时候要综合考虑CPU和内存的分配,尽量保证不要空出多余的资源。