diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/FifoIntraQueuePreemptionPlugin.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/FifoIntraQueuePreemptionPlugin.java index a580151..7ca2b0c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/FifoIntraQueuePreemptionPlugin.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/FifoIntraQueuePreemptionPlugin.java @@ -298,7 +298,8 @@ private void calculateToBePreemptedResourcePerApp(Resource clusterResource, tmpApp.getPending()); Resources.subtractFrom(appIdealAssigned, tmpApp.selected); - if (Resources.lessThan(rc, clusterResource, idealAssignedForUser, + if (!tmpUser.isAboveMaxActiveUsers() && + Resources.lessThan(rc, clusterResource, idealAssignedForUser, userLimitResource)) { Resource idealAssigned = Resources.min(rc, clusterResource, appIdealAssigned, @@ -419,6 +420,14 @@ private void getAlreadySelectedPreemptionCandidatesResource( } tmpUser.idealAssigned = Resources.createResource(0, 0); + + if ((context.getIntraQueuePreemptionOrder() + .equals(IntraQueuePreemptionOrder.USERLIMIT_FIRST)) + && (usersPerPartition.size() + >= tq.leafQueue.getUsersManager().getMaxNumActiveUsers()) ) { + tmpUser.setAboveMaxActiveUsers(true); + } + usersPerPartition.put(userName, tmpUser); } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/IntraQueueCandidatesSelector.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/IntraQueueCandidatesSelector.java index 34c30b7..1c7468f 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/IntraQueueCandidatesSelector.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/IntraQueueCandidatesSelector.java @@ -178,30 +178,6 @@ private void initializeUsageAndUserLimitForCompute(Resource clusterResource, } } - private boolean isResourceUsageUnderUserLimit(FiCaSchedulerApp app, - Resource clusterResource, Map computedUserLimitPerUser, - Resource usedResource, ResourceUsage userResourceUsage, RMContainer c) { - // Ensure below checks - // 1. This check must be done only when preemption order is USERLIMIT_FIRST - // 2. By selecting container "c", check whether this user's resource usage - // is going below its user-limit. - // 3. Used resource of user must be always greater than user-limit to - // skip some containers as per this check. If used resource is under user - // limit, then these containers of this user has to be preempted as demand - // might be due to high priority apps running in same user. - String partition = context.getScheduler() - .getSchedulerNode(c.getAllocatedNode()).getPartition(); - Resource used = userResourceUsage.getUsed(partition); - - return Resources.lessThanOrEqual(rc, clusterResource, - Resources.subtract(usedResource, c.getAllocatedResource()), - computedUserLimitPerUser.get(app.getUser())) - && Resources.greaterThan(rc, clusterResource, used, - computedUserLimitPerUser.get(app.getUser())) - && preemptionContext.getIntraQueuePreemptionOrder() - .equals(IntraQueuePreemptionOrder.USERLIMIT_FIRST); - } - private void preemptFromLeastStarvedApp(LeafQueue leafQueue, FiCaSchedulerApp app, Map> selectedCandidates, @@ -249,23 +225,6 @@ private void preemptFromLeastStarvedApp(LeafQueue leafQueue, continue; } - // If selected container brings down resource usage under its user's - // UserLimit (or equals to), we must skip such containers. - if (isResourceUsageUnderUserLimit(app, clusterResource, - computedUserLimitPerUser, rollingUsedResourcePerUser, - userResourceUsage, c)) { - - if (LOG.isDebugEnabled()) { - LOG.debug( - "Skipping container: " + c.getContainerId() + " with resource:" - + c.getAllocatedResource() + " as UserLimit for user:" - + app.getUser() + " with resource usage: " - + rollingUsedResourcePerUser + " is going under UL:" - + computedUserLimitPerUser.get(app.getUser())); - } - break; - } - // Try to preempt this container boolean ret = CapacitySchedulerPreemptionUtils .tryPreemptContainerAndDeductResToObtain(rc, preemptionContext, diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/TempUserPerPartition.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/TempUserPerPartition.java index 33ee18f..3c77c04 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/TempUserPerPartition.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/monitor/capacity/TempUserPerPartition.java @@ -33,6 +33,7 @@ private final User user; private Resource userLimit; private boolean donePreemptionQuotaForULDelta = false; + private boolean aboveMaxActiveUsers = false; TempUserPerPartition(User user, String queueName, Resource usedPerPartition, Resource amUsedPerPartition, Resource reserved, @@ -85,4 +86,18 @@ public boolean isPreemptionQuotaForULDeltaDone() { public void updatePreemptionQuotaForULDeltaAsDone(boolean done) { this.donePreemptionQuotaForULDelta = done; } + + /** + * @return the aboveMaxActiveUsers + */ + public boolean isAboveMaxActiveUsers() { + return aboveMaxActiveUsers; + } + + /** + * @param aboveMaxActiveUsers the aboveMaxActiveUsers to set + */ + public void setAboveMaxActiveUsers(boolean aboveMaxActiveUsers) { + this.aboveMaxActiveUsers = aboveMaxActiveUsers; + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/UsersManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/UsersManager.java index 579c4c7..bfbb9f5 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/UsersManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/UsersManager.java @@ -990,4 +990,8 @@ private void updateResourceUsagePerUser(User user, Resource resource, + totalResUsageForNonActiveUsers.getAllUsed()); } } + + public int getMaxNumActiveUsers() { + return 100/getUserLimit(); + } }