Yarn 作为 Hadoop 的资源调度管理器,为整个集群所有用户、所有 App 分配资源。
ResourceManager 获得每个 NodeManager 发送的心跳信息,就可以知道每个 NodeManager 上有多少 container、application 在运行,空闲的资源(memory, vcpu) 还有多少。空闲的资源就可以分配给不同的应用。
ResourceManager 主要有两种方式来分配:
-
共享整个资源池。每个提交的应用都可以享受整个集群的资源。但是这样对资源的控制力度太小,比如,当某个用户不断提交应用,会使其他用户根本无法提交。
-
细分成小资源池。将整个大的资源池划分成小的资源池,每个资源池设置不同的资源持有量。为不同的用户指定不同的资源池。再限制每个池,每个用户的最大提交应用数,这样就很好地控制资源。
目前 DI 采用第二种方式。每个应用提交到不同的 Pool,这个 Pool 里的资源就是可以分配给该应用的最大资源。
各BU之间job提交不固定,上下波动大,整个集群的资源使用率仅能达到80%上下,无法更高效的使用集群资源,造成了剩下的20%左右的资源浪费。
考虑开启资源抢占模式,目前就测试情况看存在两个问题:
1、设置抢占后,集群并不能保证minResources这部分资源一直保留,pool为空时,也会释放这部分资源;
2、抢占资源量不可控
资源调度策略(DI采用FIFO):
SchedulingPolicy: (1) fairshare/DRF, choose the Child Schedulable that is most over its fair share; (2) FIFO, choose the child Schedulable that is latest launched.Inside each application, we further prioritize preemption by choosing containers with lowest priority to preempt.
问题1 , 设置抢占后,当设置的minResources抢占超时(5s)或已低于其公平份额的公平份额抢占超时阈值,yarn会检查需要抢占的任务队列。如果这样的队列存在多少任务,计算每种类型需要被抢占,然后选择正确的使用优先任务。
问题2 ,可考虑设置浮动百分比的参数:yarn.scheduler.fair.preemption.cluster-utilization-threshold ,float, 默认0.8
FairSchedulerConfiguration.java
FairScheduler.java :
测试
FAT环境,设置preemption=true,minResources=oldMaxResources,maxResources = oldResource*(1+10%) : 咱设置10%浮动;
测试账号及脚本,资源分配:
账号:op1
脚本:select count(*) from freeway_log where month=1 and dt=20140806 ;
资源:
账号:dbcenter
脚本:select count(1) from sharedatadb.suricata_dns where data_date=2015-05-28/data_hour=8;
资源:
账号:bihtl
脚本:select count(1) from tmp_htldb.weixinpagedata_tmp where d=2014-05-20;
资源:
账号:skysea
脚本:select count(1) from dw_ubtdb.pageview where d=2014-06-23;
资源:
测试结果:
1、多账号同时跑job,均可正常执行;
2、计算量最少的job先提交,所有脚本可成功运行;
3、计算量最大的job先提交,所有脚本可成功提交;
资源抢占量最大浮动可控,不会出现资源被某pool抢占后其他账号无资源的情况:
正在执行较大数据查询测试:从生产环境搬4个账号下的20GB数据到FAT。
不重启yarn-resourcemanager 服务测试:
无极天尊 (2017/08/30 16:42:07)回复
太高端,现在还没学习hadoop,以后或许会遇到