准备知识

每个job提交到yarn执行的时候,都会分配container容器去运行,而这个容器需要资源才能运行,那这个资源就是cpu和内存,也就是每个任务container都需要CPU和内存,那么下面我们从CPU和内存去分析

CPU资源调度

目前的CPU被划分为虚拟CPU(CPU virtual Core),这里的虚拟CPU是yarn自己引入的概念,因为每个服务器的CPU计算能力不一样,有的机器可能是其他机器计算能力的两倍,然后可以通过多配置几个虚拟CPU弥补差异。在yarn中,CPU的相关配置如下:

1.yarn.nodemanager.resource.cpu-vcores
表示该节点服务器上yarn可以使用的虚拟CPU个数,默认是8,推荐将值配置与物理核心个数相同,如果节点CPU核心不足8个,要调小这个值,yarn不会智能的去检测物理核心数

2.yarn.scheduler.minimum-allocation-vcores
单个任务最小可申请的虚拟核心数,默认为1

3.yarn.scheduler.maximum-allocation-vcores
单个任务最大可申请的虚拟核心水,默认为4,如果申请资源时,超过这个配置,会抛出InvalidResourceRequestException

Memory资源调度

yarn一般允许用户配置每个节点上可用的物理资源,注意,这里是"可用的",不是物理内存多少,就设置多少,因为一个服务器节点上会有若干的内存,一部分给yarn,一部分给hdfs,一部分给hbase;Member相关的配置如下:

1.yarn.nodemanager.resource.memory-mb
设置该节点上yarn可使用的内存,默认为8G,如果节点内存资源不足8G,要减少这个值,yarn不会智能的去检测内存资源,一般这个设置yarn的可用内存资源

2.yarn.scheduler.minimum-allocation-mb
单个任务最小申请物理内存量,默认1024MB,根据自己的业务设定

3.yarn.scheduler.maximum-allocation-mb
单个任务最大申请物理内存量,默认为8291MB

案例

如果有一个服务器16核,64G内存,我们应该如何配置上面的6个参数呢(一句话:资源最大化利用)

yarn.nodemanager.resource.cpu-vcores 虚拟core
这个参数根据自己生产服务器决定,比如公司服务器很富裕,那就直接1:1,设置成16,如果公司服务器不是很富裕,那就直接成1:2,设置成32,我们生产设置的是32

yarn.nodemanager.resource.memory-mb 总内存
生产上我们一般要预留15-20%的内存,那么可用内存就是64*0.8=51.2G,我们设置成50G就可以了(固定经验值)

yarn.scheduler.minimum-allocation-mb 单任务最小内存
如果设置成2G,那50/2 = 25,就是最多可以跑25个container
如果设置成3G,那50/3 = 16,就是最多可以跑16个container

yarn.scheduler.minimum-allocation-mb 单任务最少vcore
如果设置vcore = 1,那么32/1 = 32,就是最多可以跑32个container,如果设置成这个,根据上面内存分配的情况,最多只能跑25个container,vcore有点浪费
如果设置vcore = 2,那么32/2 = 16,就是最多可以跑16个container

yarn.scheduler.maximum-allocation-vcores 单任务最多vcore
一般就设置成4个,cloudera公司做过性能测试,如果cpu大于等于5之后,cpu利用率反而不是很好(固定经验值)

yarn.scheduler.maximum-allocation-mb 单任务最大内存
这个要根据自己公司业务设定,如果有大任务,需要5-6G内存,那就设置为8G

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐