Cloudera Manager--Yarn用户资源隔离配置
Yarn用户资源隔离配置,主要使用 Yarn动态资源池(dynamic resource pool) _ 对YARN应用程序进行资源和策略分配的池。(Impala资源也可以动态管理)_
动态资源池允许安排和分配用户访问特定池,用来执行YARN应用程序。如果一个池的资源未被使用,它可以被占用(preempted)并分配给其他池。否则,就根据各个池的权重来共享资源。访问控制列表(Access control lists (ACLs)) 对提交访问和管理访问进行限制。
- 下面主要以下几个步骤来实际的操作:
- 资源隔离前:看看默认的组,以及为什么我们要去从新划分
- 规划用户组:举例本例中分配的组,以及我们线上环境一般怎么分配的
- HDFS和Yarn设置:需要修改的一些配置
- 资源池设置:主要是资源池设置以及配置相应的规则
- 示例展示:截图说明一下修改后的一些运行效果
资源隔离前
- 我弄了两张表,放入10G左右的数据,然后随便写了一个SQL在hive上运行(目的是消耗Yarn资源看看效果,以对比后面调整后的任务资源情况)
- 可以看到运行后占用了32cores,16G内存(每个map,reduce任务我设置的512MB内存,每个容器设置的1cores)
- 队列为:root.users.hue (后面说明为什么是这个队列)
规划用户组
- 我这里把用户组分为三种,便于后面测试对比。线上环境一般也是按照这个区划分,或者按照部门去划分。(在主节点创建下面用户)
- 超级用户组:root
- 开发者组:dev
- 业务分析组:query
1
2
3
4
5
6[root@xiaoxiaomo.com ~]# groupadd dev
[root@xiaoxiaomo.com ~]# groupadd query
[root@xiaoxiaomo.com ~]# useradd -g dev dev1
[root@xiaoxiaomo.com ~]# useradd -g dev dev2
[root@xiaoxiaomo.com ~]# useradd -g query query1
[root@xiaoxiaomo.com ~]# useradd -g query query2
- (我是用hue提交的SQL任务)所以hue中配置好相关的用户,如果还有sentry授权,配置相关组权限即可,这里简单的截图
(可能大部分用户不一定都使用了hue和sentry,没使用的完全可以跳过这个可以在linux等客户端中提交)
sentry权限可参考:http://blog.xiaoxiaomo.com/2016/10/19/Sentry-%E9%80%9A%E8%BF%87Cloudera-Manager%E9%85%8D%E7%BD%AESentry/
HDFS 设置
- 检查,HDFS权限检查是否开启,没有开启勾选即开启 (默认是开启的)
YARN 设置
开启,资源管理器ACL并设置相应的管理ACL (Admin ACL)
- yarn.acl.enable 默认值为true
- yarn.admin.acl 默认值为*,默认表示任何人都可以提交,查看,和关闭应用程序。
2.1. 格式为 “以逗号分隔的用户列表+空格+以逗号分隔的用户组列表”,例如 “dev1,query1 dev,query”。
2.2. 如果只有组信息,需要在最前端加入一个空格,例如” dev,query”。
2.3. 至少将”yarn”加入到用户列表中。
关闭,未声明资源池的自动生成 (默认是开启的)
yarn.scheduler.fair.allow-undeclared-pools
,不然会自动创建资源池取消,使用默认队列时的 Fair Scheduler 用户(默认是选中)
yarn.scheduler.fair.user-as-default-queue
,不然用户提交任务时不指定特定的队列,就使用以用户命名的queue。
资源池设置
进入动态资源池配置页面
可以看到默认有两个资源池(default,users)
点击
Create Resource Pool
可以创建资源池,添加相关属性,配置策略,修改提交/管理控制
比如下面我们就限制了dev资源池只能是dev组提交任务
(注意:还有一点很重要就是勾选Parent Pool
,不然配置root.[primary group].[username]规则就无法获得root.dev.dev1队列)重点看一下放置规则,只有配置合理的规则才能很好的使用我们的资源池,从上到下的优先级(默认下面三种)
4.1. 最优先运行时指定的那一个资源池,没有就创建
4.2. 第二个规则使用root.[pool name].[username]
,规则[pool name]默认为users,所以最开始我们看到的队列就是root.users.hue(我是用hue用户运行的),比如:
4.3. 最后一个,root.default,下面已经有中文说明了
设置我们自己的资源池,并配置规则库
现在我们就要求dev组的用户使用dev资源池,query组的使用query的资源池
5.1. 资源池配置(删掉之前的users资源池,添加需要的并配置权重),例如
5.2. 配置规则库,如下,其中root.[primary group].[username]只要我们上面的资源池中配置好对应的用户组的资源池即可
fair-scheduler.xml文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<allocations>
<queue name="root">
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>
<aclSubmitApps> </aclSubmitApps>
<aclAdministerApps>*</aclAdministerApps>
<queue name="default" type="parent">
<weight>1.0</weight>
<schedulingPolicy>drf</schedulingPolicy>
<aclSubmitApps>*</aclSubmitApps>
<aclAdministerApps>*</aclAdministerApps>
</queue>
<queue name="dev" type="parent">
<weight>3.0</weight>
<schedulingPolicy>drf</schedulingPolicy>
<aclSubmitApps> dev</aclSubmitApps>
<aclAdministerApps>*</aclAdministerApps>
</queue>
<queue name="query" type="parent">
<weight>4.0</weight>
<schedulingPolicy>drf</schedulingPolicy>
<aclSubmitApps> query</aclSubmitApps>
<aclAdministerApps>*</aclAdministerApps>
</queue>
</queue>
<defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
<queuePlacementPolicy>
<rule name="specified" create="true"/>
<rule name="nestedUserQueue">
<rule name="primaryGroup"/>
</rule>
<rule name="nestedUserQueue">
<rule name="default"/>
</rule>
<rule name="default"/>
</queuePlacementPolicy>
</allocations>
示例展示
我们通过上面创建的dev1,dev2,query1,query2用户运行任务,可以看到下面的队列分配情况
我在linux上创建了一个test用户,通过job ID无法kill job。通过hue登陆也能明显看到下图标记中没有kill按钮
(应为test创建时组为test,而该组和用户没在yarn.admin.acl中配置)
附录规则库说明
▪ specified at run time - 使用 root.[pool name],其中pool name是运行时指定的池的名称。
▪ root.users.[username] - 使用父池root.users,以提交应用程序的用户名在该吃中创建以用户名为池名的子池。
▪ root.default - 使用root.default池
▪ root.[pool name] - 这里的pool name是你在Pool Name中指定的池名。
▪ root.[primary group] - 使用与用户提交应用程序的主组相匹配的池。
▪ root.[secondary group] - 使用与提交应用程序的用户的次组相匹配的池。
▪ root.[username] - 使用与提交应用程序的用户的名称相匹配的池。
▪ root.[primary group].[username] - 父池匹配提交程序用户的主组,然后根据用户名创建子池。
▪ root.[secondary group].[username] - 父池匹配提交程序用户的次组,然后根据用户名创建子池。参考:
http://cwiki.apachecn.org/pages/viewpage.action?pageId=5505362
上一篇:SparkException: Could not find CoarseGrainedScheduler or it has been stopped.