本文主要讨论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://<ResourceManagerIP>: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%: 太低会造成资源浪费, 太高会造成OOMMap 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 | 节点服务器上yarn可以使用的虚拟CPU个数 |
yarn.nodemanager.resource.memory-mb | 节点服务器上yarn可以使用的内存大小 |
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堆内存的比例进行自动配置。