本文主要讨论CDH集群的YARN调优配置,关于YARN的调优配置,主要关注CPU和内存的调优,其中CPU是指物理CPU个数乘以CPU核数,即Vcores = CPU数量*CPU核数。YARN是以container容器的形式封装资源的,task在container内部执行。

集群配置

集群的配置主要包括三步,第一是先规划集群的工作主机以及每台主机的配置,第二是规划每台主机的安装的组件及其资源分配,第三是规划集群的规模大小。

工作主机的配置

如下表所示:主机的内存为256G,4个6核CPU,CPU支持超线程,网络带宽为2G

主机组件 数量 大小 总计 描述
RAM 256G 256G 内存大小
CPU 4 6 48 总CPU核数
HyperThreading CPU YES 超线程CPU,使操作系统认为处理器的核心数是实际核心数的2倍,因此如果有24个核心的处理器,操作系统会认为处理器有48个核心
网络 2 1G 2G 网络带宽

工作主机安装组件配置

第一步已经明确每台主机的内存和CPU配置,下面为每台节点的服务分配资源,主要分配CPU和内存

服务 类别 CPU核数 内存(MB) 描述
操作系统 Overhead 1 8192 为操作系统分配1核8G内存,一般4~8G
其它服务 Overhead 0 0 非CDH集群、非操作系统占用的资源
Cloudera Manager agent Overhead 1 1024 分配1核1G
HDFS DataNode CDH 1 1024 默认1核1G
YARN NodeManager CDH 1 1024 默认1核1G
Impala daemon CDH 0 0 可选的服务,建议至少为impala demon分配16G内存
Hbase RegionServer CDH 0 0 可选的服务,建议12~16G内存
Solr Server CDH 0 0 可选的服务,最低1G内存
Kudu Server CDH 0 0 可选的服务,kudu Tablet server最低1G内存
Available Container Resources 44 250880 剩余分配给yarn的container

container资源分配
Physical Cores to Vcores Multiplier:每个container的cpu core的并发线程数,本文设置为1

YARN Available Vcores:YARN可用的CPU核数=Available Container Resources * Physical Cores to Vcores Multiplier,即为44

YARN Available Memory:250880

集群大小

集群的工作节点个数:10

YARN配置

YARN NodeManager配置属性

配置参数 描述
yarn.nodemanager.resource.cpu-vcores 44 yarn 的nodemanager分配44核,每台节点剩余的CPU
yarn.nodemanager.resource.memory-mb 250800 分配的内存大小,每台节点剩余的内存

验证YARN的配置

登录YARN的resourcemanager的WEBUI:http://:8088/,验证’Memory Total’与’Vcores Total’,如果节点都正常,那么Vcores Total应该为440,Memory应该为2450G,即250800/1024*10

YARN的container配置

YARN的container的Vcore配置

配置参数 描述
yarn.scheduler.minimum-allocation-vcores 1 分配给container的最小vcore个数
yarn.scheduler.maximum-allocation-vcores 44 分配给container的最大vcore数
yarn.scheduler.increment-allocation-vcores 1 容器虚拟CPU内核增量

YARN的container内存配置

配置参数 描述
yarn.scheduler.minimum-allocation-mb 1024 分配给container的最小内存大小,为1G
yarn.scheduler.maximum-allocation-mb 250880 分配给container的最大内存,等于245G,即为每台节点剩余的最大内存
yarn.scheduler.increment-allocation-mb 512 容器内存增量,默认512M

集群资源分配估计

描述 最小值 最大值
根据每个container的最小内存分配,集群最大的container数量为 2450
根据每个container的最小Vcore分配,集群最大的container数量为 440
根据每个container的最大内存分配,集群的最小container数为 10
根据每个container的最大Vcores分配,集群的最小container数为 10

container合理配置检查

配置约束 描述
最大的Vcore数量必须大于等于分配的最小Vcore数 yarn.scheduler.maximum-allocation-vcores >= yarn.scheduler.minimum-allocation-vcores
分配的最大内存数必须大于等于分配的最小内存数 yarn.scheduler.maximum-allocation-mb >= yarn.scheduler.minimum-allocation-mb
分配的最小核数必须大于等于0 yarn.scheduler.minimum-allocation-vcores >= 0
分配的最大Vcore数必须大于等于1 yarn.scheduler.maximum-allocation-vcores >= 1
每台主机分配给nodemanaer的vcore总数必须大于分配的最小vcore数 yarn.nodemanager.resource.cpu-vcores >= yarn.scheduler.minimum-allocation-vcores
每台主机分配给nodemanaer的vcore总数必须大于分配的最大vcore数 yarn.nodemanager.resource.cpu-vcores >= yarn.scheduler.maximum-allocation-vcores
每台主机分配给nodemanaer的内存必须大于调度分配的最小内存 yarn.nodemanager.resource.memory-mb >= yarn.scheduler.maximum-allocation-mb
每台主机分配给nodemanaer的内存必须大于调度分配的最大内存 yarn.nodemanager.resource.memory-mb >= yarn.scheduler.minimum-allocation-mb
container最小配置 如果yarn.scheduler.minimum-allocation-mb小于1GB,container可能会被YARN杀死,因为会出现OutOfMemory内存溢出的现象

MapReduce配置

ApplicationMaster配置

配置参数 描述
yarn.app.mapreduce.am.resource.cpu-vcores 1 ApplicationMaster 的虚拟CPU内核数
yarn.app.mapreduce.am.resource.mb 1024 ApplicationMaster的物理内存要求(MiB)
yarn.app.mapreduce.am.command-opts 800 传递到 MapReduce ApplicationMaster 的 Java 命令行参数,AM Java heap 大小,为800M

堆与容器大小之比

配置参数 描述
task自动堆大小 yes
mapreduce.job.heap.memory-mb.ratio 0.8 Map 和 Reduce 任务的堆大小与容器大小之比。堆大小应小于容器大小,以允许 JVM 的某些开销,默认为0.8

map task配置

配置参数 描述
mapreduce.map.cpu.vcores 1 分配给map task的vcore数
mapreduce.map.memory.mb 1024 分配给map task的内存数,1G
mapreduce.task.io.sort.mb 400 I/O 排序内存缓冲 (MiB),默认256M,一般不用修改

reduce task配置

配置参数 描述
mapreduce.reduce.cpu.vcores 1 分配给reduce task的vcore数
mapreduce.reduce.memory.mb 1024 分配给reduce task的内存数,1G

MapReduce配置合理性检查

  • Application Master配置的合理性检查

yarn.scheduler.minimum-allocation-vcores <= yarn.app.mapreduce.am.resource.cpu-vcores<= yarn-scheduler.maximum-allocation-vcores

yarn.scheduler.minimum-allocation-mb <= yarn.app.mapreduce.am.resource.cpu-vcores <= yarn.scheduler.maximum-allocation-mb

Java Heap大小是container大小的75%~90%: 太低会造成资源浪费, 太高会造成OOM
Map Task配置的合理性检查

  • Reduce Task配置的合理性检查

yarn.scheduler.minimum-allocation-vcores <= mapreduce.map.cpu.vcores <= yarn-scheduler.maximum-allocation-vcores

yarn.scheduler.minimum-allocation-mb <= mapreduce.map.memory.mb <= yarn.scheduler.maximum-allocation-mb

Spill/Sort内存为每个task堆内存的40%~60%

  • Reduce Task配置的合理性检查

yarn.scheduler.minimum-allocation-vcores <= mapreduce.reduce.cpu.vcores <= yarn-scheduler.maximum-allocation-vcores

yarn.scheduler.minimum-allocation-mb <= mapreduce.reduce.memory.mb <= yarn.scheduler.maximum-allocation-mb

YARN和MapReduce配置参数总结

YARN/MapReduce参数配置 描述
yarn.nodemanager.resource.cpu-vcores 分配给container的虚拟cpu数
yarn.nodemanager.resource.memory-mb 分配给container的内存大小
yarn.scheduler.minimum-allocation-vcores 分配给container的最小虚拟cpu数
yarn.scheduler.maximum-allocation-vcores 分配给container的最大虚拟cpu数
yarn.scheduler.increment-allocation-vcores 分配给container的递增虚拟cpu数
yarn.scheduler.minimum-allocation-mb 分配给container的最小内存大小
yarn.scheduler.maximum-allocation-mb 分配给container的最大内存
yarn.scheduler.increment-allocation-mb 分配给container的递增内存大小
yarn.app.mapreduce.am.resource.cpu-vcores ApplicationMaste的虚拟cpu数
yarn.app.mapreduce.am.resource.mb ApplicationMaste的内存大小
mapreduce.map.cpu.vcores map task的虚拟CPU数
mapreduce.map.memory.mb map task的内存大小
mapreduce.reduce.cpu.vcores reduce task的虚拟cpu数
mapreduce.reduce.memory.mb reduce task的内存大小
mapreduce.task.io.sort.mb I/O排序内存大小

note:在CDH5.5或者更高版本中,参数mapreduce.map.java.opts, mapreduce.reduce.java.opts, yarn.app.mapreduce.am.command-opts会基于container堆内存的比例进行自动配置