YARN中公平调度程序的ACL不工作



我已经在fair-scheduler.xml中用ACL配置了我的队列。但其他用户也可以在同一队列中运行作业。我需要根据我的队列在其他地方定义ACL吗。任何链接或帮助都将不胜感激。感谢

 <queue name="queue1">
            <minResources>10000mb,10vcores</minResources>
            <maxResources>30000mb,30vcores</maxResources>
            <maxRunningApps>10</maxRunningApps>
            <weight>2.0</weight>
            <schedulingMode>fair</schedulingMode>
            <aclAdministerApps>User1</aclAdministerApps>
            <aclSubmitApps>User1</aclSubmitApps>
    </queue> 

NB:这是关于容量调度器的问题。不确定公平调度程序ACL继承行为是否不同。

ACL通过yarn.scheduler.capacity.<queue-path>.acl_submit_applications配置,请参阅容量调度程序:

yarn.scheduler.capacity.root.<queue-path>.acl_submit_applications控制谁可以向给定队列提交应用程序的ACL。如果给定用户/组在给定队列或层次结构中的某个父队列上具有必要的ACL,则他们可以提交应用程序。如果未指定,则从父队列继承此属性的ACL。

请注意有关继承父队列ACL的队列的信息。由于通常所有队列都继承自根队列,并且根队列ACL保留在默认的capacity-shuler.xml中,作为*:

<property>
 <name>yarn.scheduler.capacity.root.default.acl_submit_applications</name>
 <value>*</value>
 <description>
  The ACL of who can submit jobs to the default queue.
 </description>
</property>

因此,通常所有队列都获得所有用户(*)能够提交的ACL。配置队列时,应确保限制父队列以及所需队列。

更新

在查看了FS队列代码之后,我必须得出这样的结论:行为是相同的。访问检查在AllocationConfiguration.hasAccess():中完成

 public boolean hasAccess(String queueName, QueueACL acl,
      UserGroupInformation user) {
    int lastPeriodIndex = queueName.length();
    while (lastPeriodIndex != -1) {
      String queue = queueName.substring(0, lastPeriodIndex);
      if (getQueueAcl(queue, acl).isUserAllowed(user)) {
        return true;
      }
      lastPeriodIndex = queueName.lastIndexOf('.', lastPeriodIndex - 1);
    }
    return false;
  }

并不是说代码在队列层次结构上迭代(通过在名称中的每个句点上拆分ad),直到其中一个父队列授予访问权限。与容量调度程序的行为完全相同。直到它到达根队列,在这一刻,这段代码就会生效:

/**
   * Get the ACLs associated with this queue. If a given ACL is not explicitly
   * configured, include the default value for that ACL.  The default for the
   * root queue is everybody ("*") and the default for all other queues is
   * nobody ("")
   */
  public AccessControlList getQueueAcl(String queue, QueueACL operation) {
    Map<QueueACL, AccessControlList> queueAcls = this.queueAcls.get(queue);
    if (queueAcls != null) {
      AccessControlList operationAcl = queueAcls.get(operation);
      if (operationAcl != null) {
        return operationAcl;
      }
    }
    return (queue.equals("root")) ? EVERYBODY_ACL : NOBODY_ACL;
  }

还要注意队列是如何从AllocationFileLoaderService.reloadAllocations():加载的

// Load queue elements.  A root queue can either be included or omitted.  If
// it's included, all other queues must be inside it.
for (Element element : queueElements) {
  String parent = "root";
  ...
  loadQueue(parent, element, minQueueResources, maxQueueResources,
      queueMaxApps, userMaxApps, queueMaxAMShares, queueWeights,
      queuePolicies, minSharePreemptionTimeouts, queueAcls,
      configuredQueues);
}
/**
* Loads a queue from a queue element in the configuration file
*/
private void loadQueue(String parentName, Element element, ...) 
  throws AllocationConfigurationException {
String queueName = element.getAttribute("name");
if (parentName != null) {
  queueName = parentName + "." + queueName;
}    

请注意,队列名称实际上是如何与父队列连接的,并且"root"是所有队列的隐式父队列。因此,您的队列名称实际上是root.queue1

这意味着,在FS调度程序中,所有队列默认情况下都向每个人提供访问权限,因为它们都继承了root队列的默认访问权限。您需要显式重写配置文件中的root队列ACL。这与CapacityScheduler没有什么不同,但我认为获得默认表单配置的CS行为优于从代码中获得默认表单的FS行为。

我实际上并没有测试FS行为,但代码可能在读取时执行。

在文件中写入"根"队列,这是yarn.scheller.fair.allocation.file.的值

例如:

在yarn-site.xml 中

<property>
  <name>yarn.scheduler.fair.allocation.file</name>
  <value>/etc/hadoop/conf/fair-scheduler.xml</value>
</property>

在fairscheduler.xml中,应该为根队列定义acl权限。

<?xml version="1.0"?>
 <allocations>
 <queue name="root">
 <aclSubmitApps>user1,user2</aclSubmitApps>
 <aclAdministerApps>user1,user2,user3</aclAdministerApps>
 <minResources>xxxx mb,xxxvcores</minResources>
 <maxResources>xxxx mb,xxxvcores</maxResources>
 <maxRunningApps>30</maxRunningApps>
 <minSharePreemptionTimeout>10</minSharePreemptionTimeout>
 <!--sub queue begin-->
 <queue name="mapreduce">
 <minResources>xxxx mb,xxvcores</minResources>
 <maxResources>xxxx mb,xxvcores</maxResources>

 </queue>
</allocations>

如果用户被授权用于父队列,则他们被授权用于子队列。根队列的默认acl策略是"*",因此,所有用户都有权访问所有队列

<queue name="root">
<aclSubmitApps> </aclSubmitApps>
<queue name="queue1">
        <minResources>10000mb,10vcores</minResources>
        <maxResources>30000mb,30vcores</maxResources>
        <maxRunningApps>10</maxRunningApps>
        <weight>2.0</weight>
        <schedulingMode>fair</schedulingMode>
        <aclAdministerApps>User1</aclAdministerApps>
        <aclSubmitApps>User1</aclSubmitApps>
</queue> 
</queue>

它对我有效。谢谢所有

您需要在/etc/hadoop/文件夹中创建allocations.xml。在allocations.xml 中定义所有这些属性

还指定yarn-site.xml 中与调度程序相关的更改

<property>
  <name>yarn.resourcemanager.scheduler.class</name>
  <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>
<property>
  <name>yarn.scheduler.fair.allocation.file</name>
  <value>allocations.xml</value>
</property>

相关内容

  • 没有找到相关文章

最新更新