1、YARN架构设计
mr job执行流程,mr on yarn架构设计,yarn架构设计三个指的都是同一个架构
2.YARN生产上资源管理调优-非常重要
至关重要,这里是生产中hadoop平台最核心最重要的地方,伴随着hadoop平台的整个生命周期,好的yarn配置信息会,调优涉及cpu和内存,网络和磁盘在这里不做考虑。
2.1.案例:生产中机器内存资源规划
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,分别计算容器数为4~16,3~12,则实际container容器数范围为3~12个,当分配3容器且每个容器分配4core时,内存至少会有8G内存无法被利用,故须尽量合理的配置内存和cpu的上限和下限阈值,将两者的范围值拉近。
总结:重要生产hadoop进程以及内存中部署规划
1)nm,dn生产上是部署在同一台机器上,分别使用4G,2G内存
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都不满足,也是可以跑起任务的。
8)yarn的container的vcore数,Cloudera公司建议不要超过5,内存不要超过32G。
3.YARN作业调度
3.1调度类型:
作业一定是归属于某个队列的,队列中的作业调度类型如下
FIFO调度:先进先出,缺点后来小作业会一直等待大作业完成
Capacity调度:计算,缺点:浪费资源,若队列无任务也会占用资源
Fair调度:公平, 生产中只使用该调度,新任务添加入队列,等待该队列中的其它作业空出部分资源,新作业运行完毕后,还回资源。不浪费资源且任务都能运行。
3.2调度规则对比图
3.3作业调度配置
通过动态资源池(后续单独介绍)以及作业放置规则来配置的。
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>
作业放置规则:
queuePlacementPolicy这里配置的作业的放置规则,首先若该作业提交时指定了队列,则使用该队列,若没有,使用提交作业的用户主组名称队列,若没有用户主组名称队列,则不会创建队列(false),放置到默认的队列ABC中。生产中不搞子队列。