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