0%

YARN Memory CPU 配置

介绍如何配置 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个。

在环境上建议留一个给操作系统


参考链接