Cloudera Manager--Yarn用户资源隔离配置

  Yarn用户资源隔离配置,主要使用 Yarn动态资源池(dynamic resource pool) _ 对YARN应用程序进行资源和策略分配的池。(Impala资源也可以动态管理)_
动态资源池允许安排和分配用户访问特定池,用来执行YARN应用程序。如果一个池的资源未被使用,它可以被占用(preempted)并分配给其他池。否则,就根据各个池的权重来共享资源。访问控制列表(Access control lists (ACLs)) 对提交访问和管理访问进行限制。

  • 下面主要以下几个步骤来实际的操作:
    1. 资源隔离前:看看默认的组,以及为什么我们要去从新划分
    2. 规划用户组:举例本例中分配的组,以及我们线上环境一般怎么分配的
    3. HDFS和Yarn设置:需要修改的一些配置
    4. 资源池设置:主要是资源池设置以及配置相应的规则
    5. 示例展示:截图说明一下修改后的一些运行效果

资源隔离前

  • 我弄了两张表,放入10G左右的数据,然后随便写了一个SQL在hive上运行(目的是消耗Yarn资源看看效果,以对比后面调整后的任务资源情况)
  1. 可以看到运行后占用了32cores,16G内存(每个map,reduce任务我设置的512MB内存,每个容器设置的1cores)
  2. 队列为:root.users.hue (后面说明为什么是这个队列)

规划用户组

  • 我这里把用户组分为三种,便于后面测试对比。线上环境一般也是按照这个区划分,或者按照部门去划分。(在主节点创建下面用户)
  1. 超级用户组:root
  2. 开发者组:dev
  3. 业务分析组: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

HDFS 设置

  1. 检查,HDFS权限检查是否开启,没有开启勾选即开启 (默认是开启的)

YARN 设置

  1. 开启,资源管理器ACL并设置相应的管理ACL (Admin ACL)

    1. yarn.acl.enable 默认值为true
    2. yarn.admin.acl 默认值为*,默认表示任何人都可以提交,查看,和关闭应用程序。
      2.1. 格式为 “以逗号分隔的用户列表+空格+以逗号分隔的用户组列表”,例如 “dev1,query1 dev,query”。
      2.2. 如果只有组信息,需要在最前端加入一个空格,例如” dev,query”。
      2.3. 至少将”yarn”加入到用户列表中。
  2. 关闭,未声明资源池的自动生成 (默认是开启的)
    yarn.scheduler.fair.allow-undeclared-pools ,不然会自动创建资源池

  3. 取消,使用默认队列时的 Fair Scheduler 用户(默认是选中)
    yarn.scheduler.fair.user-as-default-queue,不然用户提交任务时不指定特定的队列,就使用以用户命名的queue。

资源池设置

  1. 进入动态资源池配置页面

  2. 可以看到默认有两个资源池(default,users)

  3. 点击Create Resource Pool可以创建资源池,添加相关属性,配置策略,修改提交/管理控制

    比如下面我们就限制了dev资源池只能是dev组提交任务

    注意:还有一点很重要就是勾选Parent Pool,不然配置root.[primary group].[username]规则就无法获得root.dev.dev1队列)

  4. 重点看一下放置规则,只有配置合理的规则才能很好的使用我们的资源池,从上到下的优先级(默认下面三种)
    4.1. 最优先运行时指定的那一个资源池,没有就创建
    4.2. 第二个规则使用root.[pool name].[username],规则[pool name]默认为users,所以最开始我们看到的队列就是root.users.hue(我是用hue用户运行的),比如:

    4.3. 最后一个,root.default,下面已经有中文说明了

  5. 设置我们自己的资源池,并配置规则库
    现在我们就要求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>

示例展示

  1. 我们通过上面创建的dev1,dev2,query1,query2用户运行任务,可以看到下面的队列分配情况

  2. 我在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

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器