Yarn 资源隔离与访问控制指北

Yarn 资源隔离与访问控制指北

你还在为可爱的小朋友向基于Yarn进行资源调度的大数据集群提交巨牛无比的笛卡尔积任务而苦恼吗?

你还在为不知道如何让可爱的小朋友乖乖地在正确的资源调度队列里排队而惆怅吗?

本文将为你简要分享我罗是如何从粗放式资源调度的蛮荒阶段,过渡到现如今在Hive+Sentry+Hue的使用环境下,通过Cloudera Manager提供的公平调度器、动态资源池和Linux cgroups实现队列资源隔离、队列资源可伸缩、队列访问控制的精确治理阶段。

背景

目的

  • 协调计算资源,实现队列资源隔离、队列资源可伸缩:保障azkaban调度用户绝对有资源可用的同时,满足其他用户即席查询的需求
  • 结合Sentry和Linux cgroups,实现队列的访问控制

基本需求

用户组及权值分配说明

分组 说明 权值 成员
supergroup azkaban调度用户;
通过Hive Gateway提交任务
80 hdfs, dwadmin, datadev
hive-admin Hive+Sentry 认证用户, 分组与Sentry一致;
一般通过Hue等工具提交任务
12 我罗大数据中心成员
hive-read 一般通过Hue等工具提交任务 8 我罗大数据中心之外的成员
Sentry未授权用户 被Sentry拦截 UNDEFINED

队列(资源池)访问控制

队列(资源池) 可提交组 管理组
supergroup supergroup supergroup
hive-admin hive-admin hive-admin,supergroup
hive-read * hive-admin,supergroup

队列配置

由需求可以梳理出Yarn资源调度队列配置:

队列配置示意图

公平调度器

Cloudera Manager 推荐使用该调度器,且对该调度器的支持力度最大,可以配合动态资源池和Sentry灵活地按照队列放置规则,将特定用户提交的任务放置到特定的队列中,并通过ACL严格限制队列的访问。

配置详解

Overview

为了便于管理用户提交的任务,因此将用户分组,提交任务时按分组提交到对应的队列中。具体规则如下:

组提交队列规则

yarn-site.xml

Cloudera Manager -> 集群 -> Yarn -> 配置 中直接搜索配置项

1
# 禁止未声明的资源池
2
yarn.scheduler.fair.allow-undeclared-pools = false
3
# 禁止公平调度器抢占
4
yarn.scheduler.fair.preemption = false
5
# 禁止以用户名作为默认队列
6
yarn.scheduler.fair.user-as-default-queue = false
7
# 禁用,以使队列内部分配资源的时候,采用轮询方式公平地为每个应用分配资源。若设为true,则可以设置权重,权重越大,分配的资源越多
8
yarn.scheduler.fair.sizebasedweight = false
9
# 开启Yarn的ACL
10
yarn.acl.enable=true

资源池

路径:集群 -> 动态资源池 -> Yarn -> 资源池

Overview

资源配置总览

配置说明

配置 描述 默认值 设置
队列之间按权值分配资源 如上图
最大/小资源数 该配置会覆盖,即该配置优先级高于按权分配的最大值限制
这里只加入最大资源数限制,保证某个队列不会占用过多的资源。
如上图
计划策略 CM推荐使用DRF,按照CPU和内存分配资源 DRF ALL: DRF
Application Master
最大份额
限制可用于运行 ApplicationMaster 的资源池公平份额的比例。
例如,如果设为 1.0,叶池中的 ApplicationMaster 最多可使用 100% 的内存和 CPU 公平份额;
如果值为 -1.0,将禁用 ApplicationMaster 份额的监控。
0.5 ALL:-1.0

ACL

root.supergroup:

  • 提交访问控制 组:supergroup,用户:datadev,dwadmin,hdfs
  • 管理访问控制 组:supergroup,用户:datadev,dwadmin,hdfs

root.hive-admin:

  • 提交访问控制 组:hive-admin
  • 管理访问控制 组:hive-admin

root.hive-read:

  • 提交访问控制 用户:* (允许任何用户向该池提交)
  • 管理访问控制 组:hive-admin

放置规则

路径:集群 -> 动态资源池 -> Yarn -> 放置规则

规则匹配顺序 放置规则
1 仅当池 已在运行时指定 存在时使用该池。
2 使用池 root.[secondary group]。
3 仅当池 root.[primary group] 存在时使用该池。
4 使用池 root.hive-read。 此规则始终满足。不会使用后续规则。

在配置 规则1 和 规则3 时,不要勾选:

  • 在池不存在时创建池。

规则说明

  • 规则1:保证了在Hive+Sentry的环境下,CM能够根据用户及其分组,将用户提交的任务匹配到指定的队列中。

  • 规则2:azkaban调度用户通过在Hive Gateway上通过hive -e "<HQL>"等方式提交任务。因此,需要在Hive Gateway所在的主机中,添加用户 hdfs, dwadmin, datadev,并为这三个用户都加上secondary group[^1]:supergroup(usermod -G supergroup <user>)

  • 规则3:Hive + Sentry 认证用户(Hue用户等),与Sentry Server上对用户的主分组一致。hive-admin分组被分配到root.hive-admin队列,hive-read分组被分配到root.hive-read队列

  • 规则4:兜底,如果上面的规则都未满足,任务将被放置到权值低的hive-read队列

禁止Hive用户自行制定队列

Hive启用Sentry后禁用了用户模拟功能,导致所有作业均以hive用户提交,为了防止用户提交作业到其它资源池,需要禁用hive的mapreduce.job.queue.name(mapred.job.queue.name)

  • 在CM Hive配置中搜索 hive-site.xml
  • 追加或修改:
    1
        <property>
    2
             <name>hive.conf.restricted.list</name>
    3
             <value>mapred.job.queue.name,mapreduce.job.queue.name</value>
    4
        </property>
    5
      ```  
    6
      
    7
    ### 运维手册
    8
    9
    **窗口期**
    10
    11
    下午8点之后有调度,因此尽量在下午8点之前;暂定下午7-8点进行离线集群Yarn的维护。其中不涉及重启的部分不影响正常使用,因此可以先行修改如下配置,之后发公告留出一个小时的窗口期用于重启和验证。
    12
    13
    **[18:30] 发布公告**
    14
    15
    声明将于19点-20点进行Yarn的维护,届时Hive、Hue、Impala将不可用,Presto可正常使用
    16
    17
    **添加用户组**
    18
    19
    azkaban调度用户
    20
    21
    ```shell
    22
    # login root@master1.cal.bgd.mjq.luojilab.com, 分发命令到Hive Gateway角色
    23
    sh ~/send_command.sh "groupadd supergroup"
    24
    25
    sh ~/send_command.sh "useradd hdfs"
    26
    sh ~/send_command.sh "useradd dwadmin"
    27
    sh ~/send_command.sh "useradd datadev"
    28
    # 添加azkaban调度用户secondary group
    29
    sh ~/send_command.sh "usermod -G supergroup hdfs"
    30
    sh ~/send_command.sh "usermod -G supergroup dwadmin"
    31
    sh ~/send_commasupergrouph "usermod -G supergroup datadev"

Hive + Sentry 认证用户

  1. 在对用户改动之前,先在Hue中完成对用户及其组的 新增/修改/删除
  2. 登录到Hive Server2:
1
# login root@mg03.cal.bgd.mjq.luojilab.com, 在Hive Server2角色中调整Hive+Sentry用户和组
2
cd /root/sentry/
3
# sh adduser.sh <user> <group> :添加/修改用户到组, 组可用值: hive-admin, hive-read
4
# sh deleteuser <user>: 删除用户

修改

[19:00] 重启

影响范围:

  • Yarn
  • Hue
  • Impala
  • Hive
  • Oozie
  • YARN

[19:00-20:00] 验证

用例1:

在hive-read组提交了几个大任务的条件下,azkaban调度用户通过Hive Gateway提交任务。观察azkaban调度用户能否获得足够的资源。

  1. 登录Hive Gateway,做好使用azk用户提交任务的准备
  2. 通过脚本,使用hive-admin和hive-read组的用户名向hive发送SQL,创建几个大任务
  3. 在Hive Gateway上使用azk用户提交任务

用例2:

使用azkaban调度用户,在hive -e "<HQL>" 的 HQL 中设定 mepreduce.queue.namemepred.queue.name

容量调度器(Deprecated)

由于我罗使用了Sentry认证,而Sentry底层全部使用hive用户并且关闭了模拟(impersonate),故而

配置详解

公共配置

Overview

为了便于管理用户提交的任务,因此将用户分组,提交任务时按分组提交到对应的队列中。具体规则如下:

组提交队列规则

配置

1
<property>
2
    <name>yarn.scheduler.capacity.maximum-applications</name>
3
    <value>10000</value>
4
    <description>队列容量,包含状态为Pending和Running的application</description>
5
</property>
6
<property>
7
    <name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
8
    <value>100</value>
9
    <description>集群中用于运行application master的资源占比。可用于控制application的并发数。</description>
10
</property>
11
<property>
12
    <name>yarn.scheduler.capacity.resource-calculator</name>
13
    <value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value>
14
    <description>计算资源数量的具体实现。DominantResourceCalculator: 内存,CPU;DefaultResourceCalculator: 内存。</description>
15
</property>
16
<property>
17
    <name>yarn.scheduler.capacity.queue-mappings</name>
18
    <value>g:supergroup:supergroup,g:hive-admin:hive-admin,g:hive-read:hive-read,g:default:hive-read</value>
19
    <description>用户/组 与 队列的对应关系。格式: [u or g]:[name]:[queue_name][,next_mapping]*</description>
20
</property>
21
<property>
22
    <name>yarn.scheduler.capacity.queue-mappings-override.enable</name>
23
    <value>true</value>
24
    <description>确保用户提交的任务被放入指定的队列中。</description>
25
</property>
26
<property>
27
    <name>yarn.scheduler.capacity.root.state</name>
28
    <value>RUNNING</value>
29
    <description>yarn.scheduler.capacity.{queue_path}.state。可用于启停指定queue_path的队列
30
    </description>
31
</property>

将root队列分为default, admin队列

1
<property>
2
    <name>yarn.scheduler.capacity.root.queues</name>
3
    <value>supergroup,default</value>
4
    <description>容量调度器中,root队列下必须有一个名为default的队列</description>
5
</property>

supergroup队列配置

1
<property>
2
    <name>yarn.scheduler.capacity.root.supergroup.capacity</name>
3
    <value>80</value>
4
    <description>默认队列容量</description>
5
</property>
6
<property>
7
    <name>yarn.scheduler.capacity.root.supergroup.maximum-capacity</name>
8
    <value>95</value>
9
    <description>最大队列容量</description>
10
</property>
11
<property>
12
    <name>yarn.scheduler.capacity.root.supergroup.minimum-user-limit-percent</name>
13
    <value>30</value>
14
    <description>每个用户的最低资源保证</description>
15
</property>
16
<property>
17
    <name>yarn.scheduler.capacity.root.supergroup.user-limit-factor</name>
18
    <value>100</value>
19
    <description>每个用户可用的最大资源占比</description>
20
</property>
21
<!-- 已通过用户组映射限定用户提交任务到指定队列,无需配置
22
<property>
23
    <name>yarn.scheduler.capacity.root.supergroup.acl_submit_applications</name>
24
    <value>hdfs,dwadmin,datadev</value>
25
    <description>只允许hdfs,dwadmin,datadev三个用户向supergroup队列提交任务</description>
26
</property> -->

default队列配置

1
<property>
2
    <name>yarn.scheduler.capacity.root.default.queues</name>
3
    <value>hive-admin,hive-read</value>
4
    <description>root.default队列分为hive-admin,hive-read两个子队列</description>
5
</property>
6
<property>
7
    <name>yarn.scheduler.capacity.root.default.capacity</name>
8
    <value>20</value>
9
    <description>默认队列容量</description>
10
</property>
11
<property>
12
    <name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
13
    <value>60</value>
14
    <description>最大队列容量</description>
15
</property>
16
17
<property>
18
    <name>yarn.scheduler.capacity.root.default.hive-admin.capacity</name>
19
    <value>60</value>
20
    <description>默认队列容量</description>
21
</property>
22
<property>
23
    <name>yarn.scheduler.capacity.root.default.hive-admin.maximum-capacity</name>
24
    <value>80</value>
25
    <description>最大队列容量</description>
26
</property>
27
<property>
28
    <name>yarn.scheduler.capacity.root.default.hive-admin.minimum-user-limit-percent</name>
29
    <value>30</value>
30
    <description>每个用户的最低资源保证</description>
31
</property>
32
<property>
33
    <name>yarn.scheduler.capacity.root.default.hive-admin.user-limit-factor</name>
34
    <value>80</value>
35
    <description>每个用户可用的最大资源占比</description>
36
</property>
37
<property>
38
    <name>yarn.scheduler.capacity.root.default.hive-read.capacity</name>
39
    <value>40</value>
40
    <description>默认队列容量</description>
41
</property>
42
<property>
43
    <name>yarn.scheduler.capacity.root.default.hive-read.maximum-capacity</name>
44
    <value>60</value>
45
    <description>最大队列容量</description>
46
</property>
47
<property>
48
    <name>yarn.scheduler.capacity.root.default.hive-read.minimum-user-limit-percent</name>
49
    <value>30</value>
50
    <description>每个用户的最低资源保证</description>
51
</property>
52
<property>
53
    <name>yarn.scheduler.capacity.root.default.hive-read.user-limit-factor</name>
54
    <value>60</value>
55
    <description>每个用户可以使用的最大资源占比</description>
56
</property>
57
<!-- 已通过用户组映射限定用户提交任务到指定队列,无需配置
58
<property>
59
    <name>yarn.scheduler.capacity.root.default.hive-admin.acl_submit_applications</name>
60
    <value>usera,userb,userc</value>
61
    <description>可以向root.default.hive-admin提交任务的用户</description>
62
</property>
63
<property>
64
    <name>yarn.scheduler.capacity.root.default.hive-read.acl_submit_applications</name>
65
    <value>*</value>
66
    <description>所有人都可以向root.default.hive-read</description>
67
</property> -->

运维手册

窗口期

下午8点之后有调度,因此尽量在下午8点之前;暂定下午7-8点进行离线集群Yarn的维护。其中不涉及重启的部分不影响正常使用,因此可以先行修改如下配置,之后发公告留出一个小时的窗口期用于重启和验证。

[18:30] 发布公告

声明将于19点-20点进行Yarn的维护,届时Hive、Hue、Impala将不可用,Presto可正常使用

修改调度器配置

修改 “容量调度程序配置高级配置代码段”,添加2.1. 配置详解中提到的配置

修改用户分组

假设当前用户组映射的具体实现为 org.apache.hadoop.security.ShellBasedUnixGroupsMapping,因此用户组映射关系基于Name Node所在的操作系统用户组设置[^2]。

Group Mapping

首先在Hue管理用户界面配置用户组映射,然后登录如下主机操作:

  • master1.cal.bgd.mjq.luojilab.com (NN)
1
# 创建用户组映射
2
hdfs: supergroup
3
dwadmin: supergroup
4
datadev: supergroup
5
6
usera: hive-admin
7
userb: hive-admin
8
userc: hive-admin
9
10
xxxx1: hive-read
11
xxxx2: hive-read

切换调度器

修改Scheduler 类:

  • org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler

  • org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo.FifoScheduler

  • org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler

[19:00] 重启

影响范围:

  • Yarn
  • Hue
  • Impala
  • Hive
  • Oozie
  • YARN

[19:00-20:00] 验证

如 1.2.5. 验证

是否重启?

  • 需要重启:修改了yarn-site.xml等其他组件依赖的配置。
    • 例如:切换yarn的资源调度器
    • 需要重启
  • 无需重启,需要刷新集群:修改其他组件不依赖的配置。
    • 不切换yarn的资源调度器,而是仅仅修改队列配置、用户组映射等调度器具体配置时
    • 无需重启

总结

本文根据对 CM 动态资源池以及Yarn的公平/容量调度器的调研和实验结果,给出了两种调度资源管理策略,并最终确定下我罗通过CM 动态资源池、Yarn的公平容量调度器、Hive+Sentry用户认证的方式,实现队列资源隔离、队列资源可伸缩、队列访问控制。

参考资料

  1. Hive启用Sentry后如何限制用户提交Yarn资源池
  2. 如何使用Cloudera Manager设置使用YARN队列的ACL
  3. 如何在Cloudera Manager中配置Yarn放置规则

[^1]: 因为 hdfs 等用户所在的主组另有他用,不能覆盖。
[^2]: 此外,如果启用了HDFS的HA,除了Name Node之外,用户组映射配置也需要同步到Name Node Standby节点。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×