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 "Jonathan Hung (JIRA)" <ji...@apache.org> on 2017/07/13 04:33:00 UTC

[jira] [Created] (YARN-6818) User limit per partition is not honored in branch-2.7 >=

Jonathan Hung created YARN-6818:
-----------------------------------

             Summary: User limit per partition is not honored in branch-2.7 >=
                 Key: YARN-6818
                 URL: https://issues.apache.org/jira/browse/YARN-6818
             Project: Hadoop YARN
          Issue Type: Bug
            Reporter: Jonathan Hung
            Assignee: Jonathan Hung


We are seeing an issue where user limit factor does not cap the amount of resources a user can consume in a queue in a partition. Suppose you have a queue with access to partition X, used resources in default partition is 0, and used resources in partition X is at the partition's user limit. This is the problematic code as far as I can tell: (in LeafQueue.java){noformat}    if (Resources
        .greaterThan(resourceCalculator, clusterResource,
            user.getUsed(label),
            limit)) {
      // if enabled, check to see if could we potentially use this node instead
      // of a reserved node if the application has reserved containers
      if (this.reservationsContinueLooking) {
        if (Resources.lessThanOrEqual(
            resourceCalculator,
            clusterResource,
            Resources.subtract(user.getUsed(), application.getCurrentReservation()),
            limit)) {

          if (LOG.isDebugEnabled()) {
            LOG.debug("User " + userName + " in queue " + getQueueName()
                + " will exceed limit based on reservations - " + " consumed: "
                + user.getUsed() + " reserved: "
                + application.getCurrentReservation() + " limit: " + limit);
          }
          Resource amountNeededToUnreserve = Resources.subtract(user.getUsed(label), limit);
          // we can only acquire a new container if we unreserve first since we ignored the
          // user limit. Choose the max of user limit or what was previously set by max
          // capacity.
          currentResoureLimits.setAmountNeededUnreserve(Resources.max(resourceCalculator,
              clusterResource, currentResoureLimits.getAmountNeededUnreserve(),
              amountNeededToUnreserve));
          return true;
        }
      }
      if (LOG.isDebugEnabled()) {
        LOG.debug("User " + userName + " in queue " + getQueueName()
            + " will exceed limit - " + " consumed: "
            + user.getUsed() + " limit: " + limit);
      }
      return false;
    }
{noformat}
First it sees the used resources in partition X is greater than partition's user limit. Then the reservation check also succeeds because it is checking {{user.getUsed() - application.getCurrentReservation() <= limit}} and returns true.

One fix is to just set {{Resources.subtract(user.getUsed(), application.getCurrentReservation())}} to {{Resources.subtract(user.getUsed(label), application.getCurrentReservation())}}.

This doesn't seem to be a problem in branch-2.8 and higher since YARN-3356 introduces this check: {noformat}      if (this.reservationsContinueLooking && checkReservations
          && label.equals(CommonNodeLabelsManager.NO_LABEL)) {{noformat}
so in this case getting the used resources in default partition seems to be correct.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

---------------------------------------------------------------------
To unsubscribe, e-mail: yarn-issues-unsubscribe@hadoop.apache.org
For additional commands, e-mail: yarn-issues-help@hadoop.apache.org