Hadoop Yarn Capacity调度器之ACL的一个坑

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/opensure/article/details/78296877
1、背景
Hadoop Yarn集群使用队列进行任务调度和资源分配,同时支持使用ACL控制队列允许指定用户提交,本文介绍关于yarn capacity scheduler在使用ACL时的一个坑。

2、环境
AWS EMR5.8、Hadoop2.7.3

3、实现细节
配置中支持两种操作的acl权限配置acl_administer_queue和acl_submit_applications。按照语意,如果要控制是否能提交作业,只要配置队列的acl_submit_applications属性即可,按照文档,也就是这个意思。

从源码发现其实不是的,只要有administer权限的,就能提交作业:
  @Override
  public void submitApplication(ApplicationId applicationId, String userName,
      String queue)  throws AccessControlException {
    // Careful! Locking order is important!

    // Check queue ACLs
    UserGroupInformation userUgi = UserGroupInformation.createRemoteUser(userName);
    if (!hasAccess(QueueACL.SUBMIT_APPLICATIONS, userUgi)
        && !hasAccess(QueueACL.ADMINISTER_QUEUE, userUgi)) {
      throw new AccessControlException("User " + userName + " cannot submit" +
          " applications to queue " + getQueuePath());
    }


如果要限制用户对queue的权限root queue一定要设置,不能只设置leaf queue。因为权限是根权限具有更高的优先级,看代码注释
// recursively look up the queue to see if parent queue has the permission

意思是说检查用户是否有权限时,是先看leaf queue( 如default)有没有权限,如果没有,再往上找父节点(root)看有没有权限,如果有, 成功提交任务。
如果不设置root.acl_submit_applications和root.acl_administer_queue时,默认所有leaf节点都会有所有权限,即在leaf节点设置的一切acl都无效
所以 一定要在capacity-scheduler.xml中配置
<property>
  <name>yarn.scheduler.capacity.root.acl_submit_applications</name>
  <value> </value>
</property>
<property>
  <name>yarn.scheduler.capacity.root.acl_administer_queue</name>
  <value> </value>
</property>
按上面配置以后,root节点拒绝所有人提交job,这样就可以由leaf节点直接控制权限了。



猜你喜欢

转载自blog.csdn.net/opensure/article/details/78296877
今日推荐