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