Container是nodemanager虚拟出来的容器,用来运行task任务的,调优维度是memory+vcore
如何优化Container参数??假设128G,16个物理core的服务器
1、装完Centos,消耗内存1G
2、系统预留15%-20%内存(大概26G,其中包含Centos系统占用的1G内存),用来防止全部使用导致系统夯住和oom机制,或者给未来部署组件预留点空间。
3、假设该服务器上只有DataNode,NodeManager节点,余下内存128G-26G=102G
1)DataNode大概分配2G
2)NodeManager分配4G
3)Container内存分配:
减掉DataNode和NodeManger,还剩余102G-2G-4G=96G,极限情况下服务器剩下的内存全部分给nodemanager:96G
配置参数:
yarn.nodemanager.resource.memory-mb=96G
最大分配内存和最小分配内存 yarn.scheduler.maximum-allocation-mb=96G,极限情况下,只有1个container,内存96G yarn.scheduler.minimum-allocation-mb=1G,极限情况下,只有96个container,每个内存1G
其中contanier的内存会自动增加,默认是1G的递增,contanier的数量是1-96个。
4)Contanier虚拟核:
默认服务器物理核和虚拟核的比例是1:2,16个物理core的服务器也就是拥有32虚拟核32vcore
1:2的配置参数:
yarn.nodemanager.resource.pcores-vcores-multiplier=2
极限情况下物理核全部分给nodemanager,也就是32Vcore,配置参数:
yarn.nodemanager.resource.cpu-vcores=32
分配vcore和最大分配vcore配置:
yarn.scheduler.minimum-allocation-vcores=1,极限情况下,只有32个container, yarn.scheduler.maximum-allocation-vcores=32,极限情况下,只有1个container,
所以container数量是1-32个。
官方建议,cloudera公司推荐,一个container的vcore最好不要超过5,那么设置4,所以极限情况下,32/4=8,只有8个container
yarn.scheduler.maximum-allocation-vcores=4
综合memory+vcore计算确定vocre=4,container为8个,内存分配
yarn.nodemanager.resource.memory-mb=96G yarn.scheduler.minimum-allocation-mb=1G yarn.scheduler.maximum-allocation-mb=12G 极限情况下8个container,96G/8=12G
不过当spark计算时内存不够大,这个参数肯定要调大,那么这种理想化的设置个数必然要打破,以memory为主(但是正常情况下12G是够用了),
根据内存设置参数 yarn.nodemanager.resource.memory-mb =96G yarn.scheduler.minimum-allocation-mb=1G yarn.scheduler.maximum-allocation-mb=8G 就是12个container ,vcore为12*2=24
根据vocre设置参数 yarn.nodemanager.resource.cpu-vcores =32 yarn.scheduler.minimum-allocation-vcores =1 yarn.scheduler.maximum-allocation-vcores =2
16 个container,内存占用168g=128G超过resource资源的总内存,所以根据内存为主导设置参数
vcore是yarn自己引入的,设计初衷是考虑不同节点的CPU的性能不一样,每个CPU的计算能力不一样。比如某个物理CPU是另外一个物理CPU的2倍,这时通过设置第一个物理CPU的虚拟core来弥补这种差异(当期节点的xml去设置该参数),不过一般不会存在这种问题,因为选机器不可能选不一样的。
例如:
- 假如 256G内存 56core,请问参数如何设置?
256*20%=25.6G ==52G,剩余256-52-2-4=198G
yarn.nodemanager.resource.memory-mb=198G
yarn.scheduler.minimum-allocation-mb=1G
yarn.scheduler.maximum-allocation-mb=7G
28个container 287G=196G
yarn.nodemanager.resource.cpu-vcores=112
yarn.scheduler.minimum-allocation-vcores=1
yarn.scheduler.maximum-allocation-vcores=4 - 加入该节点还有其他的组件,比如hbase和regionserver进程,那么该如何设置
hbase regionserver占用内存30G,nodemanager这种内存:96G-30G=66G
生产配置:yarn-site.xml
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
<discription>单个任务可申请最少内存,默认1024MB</discription>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
<discription>单个任务可申请最大内存,默认8192MB</discription>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>2</value>
</property>
--------------------------
用人品去感动别人,用行动去带动别人,用阳光去照耀别人,用坚持去赢得别人,要求自己每天都去做与目标有关的事情,哪怕每天只进步一点点,坚持下来你就是最优秀卓越的!欢迎大家加入大数据qq交流群:725967421 一起交流,一起进步!!
--------------------------