You are viewing a plain text version of this content. The canonical link for it is here.
Posted to yarn-issues@hadoop.apache.org by "zhuqi (Jira)" <ji...@apache.org> on 2021/01/18 05:43:00 UTC
[jira] [Comment Edited] (YARN-10532) Capacity Scheduler Auto Queue
Creation: Allow auto delete queue when queue is not being used
[ https://issues.apache.org/jira/browse/YARN-10532?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17267022#comment-17267022 ]
zhuqi edited comment on YARN-10532 at 1/18/21, 5:42 AM:
--------------------------------------------------------
The latest patch support:
For old auto created leaf queue deletion:
1. Support policy based auto deletion for expired queue:
For old auto created leaf queue:
1.1 Support GuaranteedOrZeroCapacityOverTimePolicy based deletion :
{code:java}
long lastActive =
getLeafQueueState(leafQueue, nodeLabel).getMostRecentActivationTime();
long lastDeactive =
getLeafQueueState(leafQueue, nodeLabel).getMostRecentDeactivationTime();
// Check if need delete when expired.
if (lastActive >= lastDeactive
|| (lastDeactive - lastActive)/1000 <=
scheduler.getConfiguration().
getAutoExpiredDeletionTime(managedParentQueue.getQueuePath())
|| leafQueue.getAllApplications().size() > 0) {
isExpired = false;
}
{code}
For new auto created leaf queue:
{code:java}
private synchronized void computeDynamicLeafQueueChanges(LeafQueue leafQueue)
throws SchedulerDynamicEditException {
// Expired queue, when there are no running in leafQueue
// and the last submit time has been expired
// Delete queue when expired deletion enabled.
ParentQueue parentQueue = (ParentQueue) leafQueue.getParent();
if (parentQueue == null) {
throw new SchedulerDynamicEditException("Parent " +
"queue should not be null for auto deletion!");
}
long idleDuration =
(System.currentTimeMillis()
- leafQueue.getLastSubmittedTimestamp())/1000;
if (leafQueue.getAllApplications().size() ==0
&& idleDuration > this.getConfiguration()
.getAutoExpiredDeletionTime(leafQueue.getParent().getQueuePath())
&& this.getConfiguration().
isAutoExpiredDeletionEnabled(leafQueue.getParent().getQueuePath())){
LeafQueue removed = parentQueue.
removeDynamicLeafQueue(leafQueue.getQueuePath());
if (removed != null) {
this.getCapacitySchedulerQueueManager().
removeQueue(leafQueue.getQueuePath());
}
}
}
{code}
2. Support policy not enabled with Reinitialize update deletion:
{code:java}
private void updateQueues(CSQueueStore existingQueues,
CSQueueStore newQueues) {
CapacitySchedulerConfiguration conf = csContext.getConfiguration();
for (CSQueue queue : newQueues.getQueues()) {
if (existingQueues.get(queue.getQueuePath()) == null) {
existingQueues.add(queue);
}
}
for (CSQueue queue : existingQueues.getQueues()) {
// should also support for auto created for expired deletion
// 1. handle old auto created deletion for reinitializeQueues
// 2. handle new auto created deletion for reinitializeQueues
if ((queue.getParent() != null && queue instanceof AutoCreatedLeafQueue &&
conf.isAutoExpiredDeletionEnabled(queue.getParent().getQueuePath())
&& (newQueues.get(queue.getQueuePath())) == null &&
((AutoCreatedLeafQueue) queue).isExpiredQueue())
||
(queue.getParent() != null && queue instanceof LeafQueue &&
((LeafQueue) queue).isDynamicQueue() &&
conf.isAutoExpiredDeletionEnabled(queue.getParent().getQueuePath())
&& (newQueues.get(queue.getQueuePath())) == null &&
((System.currentTimeMillis() - ((LeafQueue)queue).getLastSubmittedTimestamp())
> conf.getAutoExpiredDeletionTime(queue.getParent().getQueuePath())) &&
((LeafQueue)queue).getAllApplications().size() == 0)
||
!((AbstractCSQueue) queue).isDynamicQueue() && newQueues.get(
queue.getQueuePath()) == null && !(
queue instanceof AutoCreatedLeafQueue && conf
.isAutoCreateChildQueueEnabled(
queue.getParent().getQueuePath()))) {
existingQueues.remove(queue);
}
}
{code}
Other remaining to do:
# If we need to support auto deletion also for parent queues.
# I will deep into more details about all the corner cases.
# The queue name / queue path make confused when deletion and some related case.
was (Author: zhuqi):
The latest patch support:
For old auto created leaf queue deletion:
1. Support policy based auto deletion for expired queue:
For old auto created leaf queue:
1.1 Support GuaranteedOrZeroCapacityOverTimePolicy based deletion :
{code:java}
long lastActive =
getLeafQueueState(leafQueue, nodeLabel).getMostRecentActivationTime();
long lastDeactive =
getLeafQueueState(leafQueue, nodeLabel).getMostRecentDeactivationTime();
// Check if need delete when expired.
if (lastActive >= lastDeactive
|| (lastDeactive - lastActive)/1000 <=
scheduler.getConfiguration().
getAutoExpiredDeletionTime(managedParentQueue.getQueuePath())
|| leafQueue.getAllApplications().size() > 0) {
isExpired = false;
}
{code}
For new auto created leaf queue:
{code:java}
private synchronized void computeDynamicLeafQueueChanges(LeafQueue leafQueue)
throws SchedulerDynamicEditException {
// Expired queue, when there are no running in leafQueue
// and the last submit time has been expired
// Delete queue when expired deletion enabled.
ParentQueue parentQueue = (ParentQueue) leafQueue.getParent();
if (parentQueue == null) {
throw new SchedulerDynamicEditException("Parent " +
"queue should not be null for auto deletion!");
}
long idleDuration =
(System.currentTimeMillis()
- leafQueue.getLastSubmittedTimestamp())/1000;
if (leafQueue.getAllApplications().size() ==0
&& idleDuration > this.getConfiguration()
.getAutoExpiredDeletionTime(leafQueue.getParent().getQueuePath())
&& this.getConfiguration().
isAutoExpiredDeletionEnabled(leafQueue.getParent().getQueuePath())){
LeafQueue removed = parentQueue.
removeDynamicLeafQueue(leafQueue.getQueuePath());
if (removed != null) {
this.getCapacitySchedulerQueueManager().
removeQueue(leafQueue.getQueuePath());
}
}
}
{code}
2. Support policy not enabled with Reinitialize update deletion:
{code:java}
private void updateQueues(CSQueueStore existingQueues,
CSQueueStore newQueues) {
CapacitySchedulerConfiguration conf = csContext.getConfiguration();
for (CSQueue queue : newQueues.getQueues()) {
if (existingQueues.get(queue.getQueuePath()) == null) {
existingQueues.add(queue);
}
}
for (CSQueue queue : existingQueues.getQueues()) {
// should also support for auto created for expired deletion
// 1. handle old auto created deletion for reinitializeQueues
// 2. handle new auto created deletion for reinitializeQueues
if ((queue.getParent() != null && queue instanceof AutoCreatedLeafQueue &&
conf.isAutoExpiredDeletionEnabled(queue.getParent().getQueuePath())
&& (newQueues.get(queue.getQueuePath())) == null &&
((AutoCreatedLeafQueue) queue).isExpiredQueue())
||
(queue.getParent() != null && queue instanceof LeafQueue &&
((LeafQueue) queue).isDynamicQueue() &&
conf.isAutoExpiredDeletionEnabled(queue.getParent().getQueuePath())
&& (newQueues.get(queue.getQueuePath())) == null &&
((System.currentTimeMillis() - ((LeafQueue)queue).getLastSubmittedTimestamp())
> conf.getAutoExpiredDeletionTime(queue.getParent().getQueuePath())) &&
((LeafQueue)queue).getAllApplications().size() == 0)
||
!((AbstractCSQueue) queue).isDynamicQueue() && newQueues.get(
queue.getQueuePath()) == null && !(
queue instanceof AutoCreatedLeafQueue && conf
.isAutoCreateChildQueueEnabled(
queue.getParent().getQueuePath()))) {
existingQueues.remove(queue);
}
}
{code}
Other remaining to do:
# If we need to support auto deletion also for parent queues.
# I will deep into more details about all the corner cases.
> Capacity Scheduler Auto Queue Creation: Allow auto delete queue when queue is not being used
> --------------------------------------------------------------------------------------------
>
> Key: YARN-10532
> URL: https://issues.apache.org/jira/browse/YARN-10532
> Project: Hadoop YARN
> Issue Type: Sub-task
> Reporter: Wangda Tan
> Assignee: zhuqi
> Priority: Major
> Attachments: YARN-10532.001.patch, YARN-10532.002.patch, YARN-10532.003.patch
>
>
> It's better if we can delete auto-created queues when they are not in use for a period of time (like 5 mins). It will be helpful when we have a large number of auto-created queues (e.g. from 500 users), but only a small subset of queues are actively used.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: yarn-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: yarn-issues-help@hadoop.apache.org