生产环境调优Container参数
Container
Container是nodemanager虚拟出来的容器,用来运行task任务的,调优维度是memory+vcore
如何优化Container参数??假设128G,16个物理core的服务器
- 装完Centos,消耗内存1G
- 系统预留15%-20%内存(大概26G,其中包含Centos系统占用的1G内存),用来防止全部使用导致系统夯住和oom机制,或者给未来部署组件预留点空间
- 假设该服务器上只有DataNode,NodeManager节点,余下内存128G-26G=102G
DataNode大概分配2G,NodeManager分配4G,剩余102G-2G-4G=96G
Container内存分配:
极限情况下服务器剩下的内存全部分给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个
Contanier虚拟核: 默认服务器物理核和虚拟核的比例是1:2,也就是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,所以
yarn.scheduler.maximum-allocation-vcores=4,极限情况下,32/4=8,只有8个container
综合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为122=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,请问参数如何设置
25620%=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
调度器
- FIFO先进先出
- Capacity计算,有一个专门的队列来运行小任务,但是为了小任务专门设置一个队列预先占用一定的集群资源。这就会导致岛任务执行时间落后于FIFO的调度时间
- Fair公平,job1提交的时候,使用资源是100%;这个时候提交job2,job2就在等,等job1也就是某个container容器的task运行完毕,释放内存,这个时候job2就会使用这部分内存去运行;当job2运行完毕,这个时候就会把资源再次还回去;不会计算调度那样浪费资源
CDH默认是Fair,Apache默认是capacity
常用hadoop命令和yarn命令
yarn jar
hadoop jar
yarn application -kill 用于杀死夯住的进程