生产环境调优Container参数

Container

Container是nodemanager虚拟出来的容器,用来运行task任务的,调优维度是memory+vcore
如何优化Container参数??假设128G,16个物理core的服务器
生产环境调优Container参数

  1. 装完Centos,消耗内存1G
  2. 系统预留15%-20%内存(大概26G,其中包含Centos系统占用的1G内存),用来防止全部使用导致系统夯住和oom机制,或者给未来部署组件预留点空间
  3. 假设该服务器上只有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,内存占用16
    8g=128G超过resource资源的总内存,所以根据内存为主导设置参数
    vcore是yarn自己引入的,设计初衷是考虑不同节点的CPU的性能不一样,每个CPU的计算能力不一样。比如某个物理CPU是另外一个物理CPU的2倍,这时通过设置第一个物理CPU的虚拟core来弥补这种差异(当期节点的xml去设置该参数),不过一般不会存在这种问题,因为选机器不可能选不一样的。
  4. 假如 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 28
    7G=196G
    yarn.nodemanager.resource.cpu-vcores=112
    yarn.scheduler.minimum-allocation-vcores=1
    yarn.scheduler.maximum-allocation-vcores=4
  5. 加入该节点还有其他的组件,比如hbase和regionserver进程,那么该如何设置
    hbase regionserver占用内存30G,nodemanager这种内存:96G-30G=66G

调度器

  1. FIFO先进先出
    生产环境调优Container参数
  2. Capacity计算,有一个专门的队列来运行小任务,但是为了小任务专门设置一个队列预先占用一定的集群资源。这就会导致岛任务执行时间落后于FIFO的调度时间
    生产环境调优Container参数
  3. Fair公平,job1提交的时候,使用资源是100%;这个时候提交job2,job2就在等,等job1也就是某个container容器的task运行完毕,释放内存,这个时候job2就会使用这部分内存去运行;当job2运行完毕,这个时候就会把资源再次还回去;不会计算调度那样浪费资源
    生产环境调优Container参数
    CDH默认是Fair,Apache默认是capacity

常用hadoop命令和yarn命令

yarn jar
hadoop jar
yarn application -kill 用于杀死夯住的进程