本篇文章仅适用于YARN群集,并描述了如何为您的群集调整和优化YARN。
如果你还尚未了解清晰YARN的执行原理请跳转至
hadoop的前世今生
资源估算
- 物理CPU数:虚拟CPU数系数比定为1:2
- 预留
2
个Core、8
G内存给系统
物理Core | 虚拟VCore | 内存 | |
---|---|---|---|
三台主机 | (3*8)24 | (2*24)48 | (3*32)96 |
预留三台主机 | (3*6)18 | (3*12)36 | (3*24)72G |
正常情况下,需为系统预留20%
左右的内存。视情况分配系统占用内存,如果你192GB
的内存也给系统192GB*20%
吗,这显然是不合理的。
YARN资源分配
我司生产目前配置在
4.本人目前公司生产配置
小节
1、假设只有DN NM节点
生产上部署一般遵循存储计算一体化,计算时发现本节点有数据不需要去其他节点拉取,节省网络I/O。(数据本地化)
1.1 如何确定DN&NM分配多少内存
在业务高峰期查看Linux中DN与NM的内存占用情况。本次实验我DN最高占用了800M,NM最高占用1.5G。所以:
- DataNode分配1G,NodeManger分配2G
- 3台DN:3 * 1G=3G
- 3台NM:3 * 2G=6G
- 剩余的72G-3-6=63G给
Container
容器使用
1.2 新集群的内存规划
(生产经验)初始每台DN为2G,NM为4G。如果觉得给多了自己慢慢减,集群庞大就加。
2、Container内存
Note | Name | Value |
---|---|---|
所有容器的内存总和 | yarn.nodemanager.resource.memory-mb | 63G |
每个容器最小多少 | yarn.scheduler.minimum-allocation-mb | 1G |
每个容器最大多少 | yarn.scheduler.maximum-allocation-mb | 63G |
- 极限情况,一般不会出现
- 每个容器1G,有63个Container
- 一个容器63G,只有一个Container
- 内存管理是动态的,容器如果1G不够,会自动扩大容器内存大小
- 递增值可以自行配置,但不太需要去动
3、Container Vcore
Note | Name | Value |
---|---|---|
物理Core跟虚拟Core转换比例 | yarn.nodemanager.resource.pcores-vcores-multiplier | 2 |
所有容器的Vcore之和 | yarn.nodemanager.resource.cpu-vcores | 36 |
每个容器最小多少 | yarn.scheduler.minimum-allocation-vcores | 1 |
每个容器最大多少 | yarn.scheduler.maximum-allocation-vcores | 36 |
4、本人目前公司生产配置
- Cloudera公司推荐,一个container的vcore最好不要超过5
- 假定我最多给8个容器,每个容器可用Vcore为4个,配置如下
Note | Name | Value |
---|---|---|
物理Core跟虚拟Core转换比例 | yarn.nodemanager.resource.pcores-vcores-multiplier | 2 |
所有容器的内存总和 | yarn.nodemanager.resource.memory-mb | 63G |
每个容器内存最小多少 | yarn.scheduler.minimum-allocation-mb | 1G |
每个容器内存最大多少 | yarn.scheduler.maximum-allocation-mb | 63G/8G≈8G |
所有容器的Vcore之和 | yarn.nodemanager.resource.cpu-vcores | 36 |
每个容器core最小多少 | yarn.scheduler.minimum-allocation-vcores | 1 |
每个容器core最大多少 | yarn.scheduler.maximum-allocation-vcores | 4~5 |
- 但是spark计算时内存有些指标比较大,那么这个
yarn.scheduler.maximum-allocation-mb
必然调大。这种理想化、完美化的设置必然被打破,到时以实际作业需求memory为主 - 补充:以下参数你自己看着搞
Note | Name | Default Value |
---|---|---|
是否将对容器实施物理内存限制 | yarn.nodemanager.pmem-check-enabled | true |
是否将对容器实施虚拟内存限制 | yarn.nodemanager.vmem-check-enabled | true |
跟上面俩参数的比例有关,官网查去 | yarn.nodemanager.vmem-pmem-ratio | 2.1 |
用于确定是否应将逻辑处理器(例如超线程)视为核心的标志 | yarn.nodemanager.resource.count-logical-processors-as-cores | false |
5、调度器
待续。。选择适合你们公司场景的调度器可以大大提升作业的速度
- FIFO调度器(默认)
- 公平调度器(CDH默认调度器)
- 容量调度器