天天看點

Hadoop Yarn Capacity排程器之ACL的一個坑

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節點直接控制權限了。

繼續閱讀