本文主要讨论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配置

配置参数


描述

.resource.cpu-vcores

1

ApplicationMaster 的虚拟CPU内核数

.resource.mb

1024

ApplicationMaster的物理内存要求(MiB)

.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 <= .resource.cpu-vcores<= yarn-scheduler.maximum-allocation-vcores

yarn.scheduler.minimum-allocation-mb <= .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的递增内存大小

.resource.cpu-vcores

ApplicationMaste的虚拟cpu数

.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.optsmapreduce.reduce.java.opts.command-opts会基于container堆内存的比例进行自动配置