CDH| Yarn资源队列划分管理
Yarn用户资源隔离配置,主要使用 Yarn动态资源池(dynamic resource pool) _ 对YARN应用程序进行资源和策略分配的池。(Impala资源也可以动态管理)_
动态资源池允许安排和分配用户访问特定池,用来执行YARN应用程序。如果一个池的资源未被使用,它可以被占用(preempted)并分配给其他池。否则,就根据各个池的权重来共享资源。访问控制列表(Access control lists (ACLs)) 对提交访问和管理访问进行限制。
现阶段集群资源使用没有进行明确的划分,业务线与业务线之间任务存在挣抢资源的情况,为了解决这种问题,需要对集群做资源划分和用户划分,使用的集群为cdh集群,cdh集群已经集成了动态资源池,所以我们也直接采用cdh的资源配置方式进行规划。
划分的目的为针对不同业务、不同用户、不同需求、不同场景的使用,对yarn任务资源池进行规划和分配,达到资源的管控和隔离,避免各个任务之间产生影响,保证生产环境任务运行稳定。
1、 yarn资源队列参数设置:
(1) yarn.scheduler.fair.user-as-default-queue false
(2) yarn.scheduler.fair.allow-undeclared-pools false
2、 CDH 动态资源队列配置入口
3、 根据用户的资源队列管理
如图,第一步我们划分了2个大的父资源池:
(1) default:默认池,没有划分资源池的用户会提交到default资源池
a. 这里权重为10%,default:users 资源成1:9;
b. 这里不要设置为父池,一定要保证为叶子节点即子池,不然提交不了任务;
c. CPU:c 计划策略这里我采用的都是DRF;
d. 提交访问控制:配置用户权限,配置哪些用户有权限提交任务,注意用逗号分隔(可默认不配);
e. 管理访问控制:配置用户对资源池的管理权限,注意用逗号分开(可默认不配);
(2) users池:特定用户提交任务到该池
users池配置跟default基本一样,唯一区别是权限控制所对应用户有所调整:
3个用户:
比如用户a:
(一) 用户划分
用户划分主要是为了对业务线和运行环境进行系统级别的隔离,这里划分了两个用户,分别对应好房和合生通业务线,如下:
用户名 |
用户目录 |
备注 |
a |
/home/a |
a 业务线用户 |
b |
/home/b |
b 业务线用户 |
hdfs |
/var/lib/hadoop-hdfs |
大数据公共用户 |
各个业务线使用对应的用户提交任务,涉及到的脚本/依赖/任务/资源等也统一部署在使用的用户下。
(二) 资源池划分
资源池划分,主要是在yarn队列/集群资源级别做一个隔离,针对上边的用户,划分的资源池情况如下:
资源池名称 |
父池 |
备注 |
适用任务 |
root |
无 |
集群根资源池 |
无 |
root.default |
root |
集群默认资源池 |
未指定资源池/用户 |
root.users |
root |
用户提交任务资源池 |
各个用户的父池 |
root.users.hdfs |
users |
hdfs用户保留资源池 |
大数据公共资源池 |
root.users.a |
users |
( a 资源池 ) |
a 相关业务 |
root.users.b |
users |
( b 资源池 ) |
b 相关业务 |
四、 使用及注意事项
一)Hive任务
各业务线使用对应的用户登陆服务器,运行hive任务默认使用当前用户的资源池,不需要做特殊处理,如需要特别指定运行的资源池,可以通过以下方式设置对应的资源池
SET mapreduce.job.queuename=xxxx //xxxx资源池名称 |
二)MapReduce任务
提交普通的MR任务,可以通过两种方式使用资源池:
- 不指定资源池,提交到当前用户的资源池,如果当前用户的资源池不存在,提交到default资源池.
- 指定资源池,需要在提交任务时,指定具体的资源池参数,参数如下:
hadoop jar applincation.jar -D mapreduce.job.queuename=xxxx //xxxx资源池名称 |
三)Spark任务
Spark任务,在运行时,必须指定要使用的资源池,不然Spark会自动创建资源池,指定资源池的命令如下:
spark-shell --master yarn --queue xxxx //xxxx资源池名称 |
spark-submit --master yarn --queue xxxx //xxxx资源池名称 |
四)Flink任务
Flink任务,在运行时,必须要指定使用的资源池, 指定资源池的参数命令如下:
./bin/flink run application.jar -qu | --queue xxxx //xxxx资源池名称 |
五、 压力测试
一) 资源池满负载情况
User用中资源已满,图中灰色部分为已经分配使用的资源池,虚线部分为当前保留可用动态使用的资源池。
(二) 任务等待情况
(三) 集群资源使用情况
(四) 各个资源池使用情况
Hst资源池使用情况,可用看到cpu已经分配完毕
Easylife资源池资源已经分配完毕
Hdfs资源池资源已经分配完毕
通过上边一系列情况可用看出,在三个资源池都分配完毕后,任务还是正常运行,没有出现无法提交任务,任务出错等问题.多租户配置方案可用满足我们对资源和运行环境的隔离需求。