准备知识
每个job提交到yarn执行的时候,都会分配container容器去运行,而这个容器需要资源才能运行,那这个资源就是cpu和内存,也就是每个任务container都需要CPU和内存,那么下面我们从CPU和内存去分析
yarn参数配置文件为yarn-site.xml
CPU资源调度
目前的CPU被划分为虚拟CPU(CPU virtual Core),这里的虚拟CPU是yarn自己引入的概念,因为每个服务器的CPU计算能力不一样,有的机器可能是其他机器计算能力的两倍,然后可以通过多配置几个虚拟CPU弥补差异。在yarn中,CPU的相关配置如下:
yarn.nodemanager.resource.cpu-vcores
表示该节点上YARN可使用的虚拟CPU个数,默认是8,注意,目前推荐将该值设值为与物理CPU核数数目相同。如果你的节点CPU核数不够8个,则需要调减小这个值,而YARN不会智能的探测节点的物理CPU总数。
yarn.scheduler.minimum-allocation-vcores
单个任务可申请的最小虚拟CPU个数,默认是1,如果一个任务申请的CPU个数少于该数,则该对应的值改为这个数。
yarn.scheduler.maximum-allocation-vcores
单个任务可申请的最多虚拟CPU个数,默认是4。
注意:这里说的cpu个数都是说的虚拟cpu,默认的是1个物理cpu=2个虚拟cpu
Memory资源调度
yarn一般允许用户配置每个节点上可用的物理资源,注意,这里是"可用的",不是物理内存多少,就设置多少,因为一个服务器节点上会有若干的内存,一部分给yarn,一部分给hdfs,一部分给hbase;Member相关的配置如下:
1.yarn.nodemanager.resource.memory-mb
设置该节点上yarn可使用的内存,默认为8G,如果节点内存资源不足8G,要减少这个值,yarn不会智能的去检测内存资源,一般这个设置yarn的可用内存资源
2.yarn.scheduler.minimum-allocation-mb
单个任务可申请的最小的内存大小,默认是1G,当内存不够时,会自动按照一定大小累加内存。
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
yarn.nodemanager.resource.memory-mb : 50G 计算总内存
yarn.nodemanager.resource.cpu-vcores : 32
yarn.scheduler.minimum-allocation-mb : 2G 25个C
yarn.scheduler.minimum-allocation-vcores: 1 32个C
yarn.scheduler.maximum-allocation-mb : 8G 6个C
yarn.scheduler.maximum-allocation-vcores : 4 8个C
一个container的core 正常最大不要超过5 cloudera规定
这里有两个值可以确定,就是最大4个cpu,和内存总使用数时50G,其余四个参数可以根据业务实际情况做调整,反正始终记住:资源最大化利用 并不是100利用 而是让剩余越来越少 。
注意:只见过内存不够的时候 会自动累加,没有见过vcore不够的时候 会自动累加 , 是启动的指定的 spark executor-cores