我已经在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>