介绍如何配置 YARN 对内存和CPU的使用
前言
以下内容是我学习的理解,主要还是转载武基鹏的YARN的Memory和CPU调优配置详解。
Hadoop YARN 同时支持内存和 CPU 两种资源的调度
YARN 作为一个资源调度器,应该考虑到集群里面每一台机子的计算资源,然后根据 application 申请的资源进行分配 Container
Container 是 YARN 里面资源分配的基本单位,一个 Container 就是一组分配的系统资源,现阶段只包含内存、CPU 系统资源
Container 和集群节点的关系是一个节点会运行多个 Container,但一个 Container 不会跨节点
在 YARN 集群中,平衡内存、CPU、磁盘的资源的很重要的,作为一般建议,每个磁盘和每个核心允许两个容器可以为群集利用率提供最佳平衡。
确定群集节点的适当 YARN 内存配置时,从可用的硬件资源开始分析
- RAM(内存量)
- CORES(CPU内核数)
- DISKS(磁盘数)
关键参数默认值如下表:
参数 | 默认值 |
---|---|
yarn.nodemanager.resource.memory-mb | -1 (代表NodeManager占机器总内存80%) |
yarn.scheduler.minimum-allocation-mb | 1024MB |
yarn.scheduler.maximum-allocation-mb | 8192MB |
yarn.nodemanager.resource.cpu-vcores | -1 (代表值为8个虚拟CPU) |
yarn.scheduler.minimum-allocation-vcores | 1 |
yarn.scheduler.maximum-allocation-vcores | 4 |
内存配置
关于内存相关的配置可以参考 hortonwork 公司的文档Determine HDP Memory Configuration Settings来配置你的集群
YARN 可用的内存资源应该要考虑预留内存,预留内存是系统进程和其他Hadoop进程(例如HBase)所需的内存。
预留内存 = 操作系统内存预留 + HBase 内存预留(如果HBase在同一节点上)
保留内存建议
每个节点的总内存 | 建议的预留系统内存 | 建议的保留 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 |
下一个计算是确定每个节点允许的最大容器数。可以使用以下公式:
containers = min (2 * CORES, 1.8 * DISKS, (Total available RAM) / MIN_CONTAINER_SIZE)
说明:
CORES 为机器CPU核数
DISKS 为机器上挂载的磁盘个数
Total available RAM 为机器总内存
MIN_CONTAINER_SIZE 是指 container 最小的容量大小
MIN_CONTAINER_SIZE
这需要根据具体情况去设置,在较小的内存节点中,
最小容器大小也应该较小,下表概述了推荐值:
每台机子可用内存 | container 最小值 |
---|---|
小于4GB | 256MB |
4GB到8GB之间 | 512MB |
8GB到24GB之间 | 1024MB |
大于24GB | 2048MB |
每个 container 的平均使用内存大小计算方式为
RAM-per-container = max(MIN_CONTAINER_SIZE, (Total Available RAM) / containers))
配置文件 | 配置设置 | 默认值 | 计算值 |
---|---|---|---|
yarn-site.xml | yarn.nodemanager.resource.memory-mb | 8192MB | = containers * RAM-per-container |
yarn-site.xml | yarn.scheduler.minimum-allocation-mb | 1024MB | = RAM-per-container |
yarn-site.xml | yarn.scheduler.maximum-allocation-mb | 8192MB | = containers * RAM-per-container |
举个例子: 对于 128G 内存、32核CPU 的机器,挂载了 7 个磁盘,根据上面的说明,系统保留内存为 24G,
不适应 HBase 情况下,系统剩余可用内存为 104G,计算 containers 值如下
containers = min (2 * 32, 1.8 * 7 , (128-24)/2) = min (64, 12.6 , 52) = 13
计算 RAM-per-container 值如下
RAM-per-container = max (2, (124-24)/13) = max (2, 8) = 8
可以使用脚本 yarn-utils.py 来计算上面的值
执行下面命令,python 版本为 python2
python2 yarn-utils.py -c 32 -m 128 -d 7 -k False
这样的话,每个container内存为8G,似乎有点多,还是更愿意根据集群使用情况任务将其调整为2G内存,则集群中下面的参数配置值如下
配置文件 | 配置设置 | 计算值 |
---|---|---|
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 |
CPU 配置
YARN中目前的CPU被划分成虚拟CPU(CPU virtual Core),这里的虚拟CPU是YARN自己引入的概念,
初衷是,考虑到不同节点的CPU性能可能不同,每个CPU具有的计算能力也是不一样的,
比如某个物理CPU的计算能力可能是另外一个物理CPU的2倍,这时候,
你可以通过为第一个物理CPU多配置几个虚拟CPU弥补这种差异。
用户提交作业时,可以指定每个任务需要的虚拟CPU个数。
在YARN中,CPU相关配置参数如下
yarn.nodemanager.resource.cpu-vcores
表示能够分配给Container的CPU核数,默认配置为-1,代表值为8个虚拟CPU,推荐该值的设置和物理CPU的核数数量相同,若不够,则需要调小该值。yarn.scheduler.minimum-allocation-vcores
的默认值为1,表示每个Container容器在处理任务的时候可申请的最少CPU个数为1个。yarn.scheduler.maximum-allocation-vcores
的默认值为4,表示每个Container容器在处理任务的时候可申请的最大CPU个数为4个。
在环境上建议留一个给操作系统
参考链接