hadoop之YARN

YARN生产上资源管理调优
案例:生产中机器内存资源规划
1)一台机器,如48G,8core,首选分配Linux系统本身要占内存+空留: 20% =9.6G, 剩余80%约38G
  2)vim hadoop-env.sh #编辑文件,修改 nn,dn进程运行是占用的内存,默认1000M
   HADOOP_NAMENODE_OPTS=-Xmx1024m -Xms1024m #测试追加等号右边参数,修改nn进程内存为1024,生产中根据hadoop集群规模,8G一般够用
    HADOOP_DATANODE_OPTS=-Xmx1024m -Xms1024m #测试追加等号右边参数,修改dn进程内存为1024,DN进程: 生产是4G,完全够用
  3)yarn-env.sh #编辑文件,修改 nm,rm进程运行是占用的内存,默认1000M
    export YARN_RESOURCEMANAGER_HEAPSIZE=1024 #测试修改rm进程内存为1024M,生产8G,完全够用
   export YARN_NODEMANAGER_HEAPSIZE=1024 #测试修改rmnm内存为1024M,生产4G,完全够用
  4)若模拟生产,环境当前节点只部署了nm,dn进程,当前剩余资源 38 - 4 -4 = 30G。
    编辑yarn-site.xml文件,进行nm内存配置,配置信息如下:
    yarn.nodemanager.resource.memory-mb #重要,这个参数是配置你nm可使用的总内存总量,默认是8192M,这里要配置为可支配的内存资源,即32*1024M
    yarn.scheduler.minimum-allocation-mb #默认,容器初始分配最小1024M
    yarn.scheduler.maximum-allocation-mb #默认,容器最终分配最大内存8192M
    此时该机器容器理论数为2-30个,当容器为2时,且其它任务所需要内存远超4G时,就会有4内存浪费了,
  生产案列:所以以30G内存算我们可以适当将配置最小改为2G,最大为30G(这个最大根据集群实际作业来确定,若都是小作业那么10G也是可以的),container默认是一开始以最低内存去运行任务,若内存不够会一个G一个G的去增加内存,直至达到最大内存限制,若最大内存还不够,则会报异常p memory oom,生产只会将容器内存上限调大,不会调小了。
  5)vcore是分配给容器的逻辑cpu,它一旦分配,则在容器运行阶段不可更改
    编辑yarn-site.xml文件,配置如下:
    yarn.nodemanager.resource.cpu-vcores 12 #默认是8,生产上根据实际计划的core数来配置
    yarn.scheduler.minimum-allocation-vcores 1
    yarn.scheduler.maximum-allocation-vcores 4
   我因为有8个物理cpu故我放大两倍填为了16,分出4core给其应用,不能因为hadoop繁忙时导致其它进程夯住了。最新的官网pcore和vcore配置比为1:1。若资源很多可以只放大1倍。
  6)高级调优:此时以内存 32 :2:8,cpu 12:1:4,分别计算容器数为416,312,则实际container容器数范围为3~12个,当分配3容器且每个容器分配4core时,内存至少会有8G内存无法被利用,故须尽量合理的配置内存和cpu的上限和下限阈值,将两者的范围值拉近。

总结:重要生产hadoop进程以及内存中部署规划
  1)nm,dn生产上是部署在同一台机器上,分别使用4G内存
  2)rm,nn可以部署在同一台机器(穷),分别使用8G内存,该机器尽量不部署nm,dm。若hadoop集群节点较多,如上百节点以上可以考虑,将nn增大至16G
  3)hadoop集群机器可能还部署了其它集群,如kafka或者Hbase,在上面基础上要减去这些组件使用的内存才是nm真正可支配使用的内存。
  4)snn生产上不会部署,会使用ha进行热备份nn。
  5)hdfs进程内存大小修改位置于hadoop-env.sh的HADOOP_进程名_OPTS。yarn进程内存大小修改位置于yarn-env.sh的 YARN_进程名_HEAPSIZE
  6)通过编辑文件yarn-site.xml来修改内存以及vcore调优
  7)虽然设置了容器的最大和最小内存,但是hadoop不会真的去检验是否有那么多的物理内存,即使是最低的1G都不满足,也是可以跑起任务的。

YARN作业调度
调度规则对比图:
在这里插入图片描述
作业调度配置

生产上CDH hadoop在页面上是通过动态资源池(后续单独介绍)以及作业放置规则来配置的。

Apache Hadoop官网案例中队列信息配置如下:配置了队列名称、所能获取的资源信息、资源权重、调度规则

<?xml version="1.0"?>
<allocations>
  <queue name="ABC">
    <minResources>10000 mb,10vcores</minResources>
    <maxResources>60000 mb,30vcores</maxResources>
    <weight>2.0</weight>
    <schedulingPolicy>fair</schedulingPolicy>
  </queue> 
  
<queue name="XYZ">
      <minResources>20000 mb,0vcores</minResources>
      <maxResources>80000 mb,0vcores</maxResources>
      <weight>3.0</weight>
      <schedulingPolicy>fifo</schedulingPolicy>  
</queue>
<queueMaxResourcesDefault>40000 mb,20vcores</queueMaxResourcesDefault>
<queuePlacementPolicy>
    <rule name="specified" />
    <rule name="primaryGroup" create="false" />
    <rule name="default" queue="ABC"/>
  </queuePlacementPolicy>
</allocations>

猜你喜欢

转载自blog.csdn.net/weixin_43212365/article/details/88628269
今日推荐