版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/opensure/article/details/78296877
1、背景
Hadoop Yarn集群使用队列进行任务调度和资源分配,同时支持使用ACL控制队列允许指定用户提交,本文介绍关于yarn capacity scheduler在使用ACL时的一个坑。
2、环境
2、环境
AWS EMR5.8、Hadoop2.7.3
3、实现细节
配置中支持两种操作的acl权限配置acl_administer_queue和acl_submit_applications。按照语意,如果要控制是否能提交作业,只要配置队列的acl_submit_applications属性即可,按照文档,也就是这个意思。
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节点直接控制权限了。