diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/Resources.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/Resources.java index fdd9ec7..d62e558 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/Resources.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/Resources.java @@ -172,6 +172,24 @@ public static Resource subtract(Resource lhs, Resource rhs) { return subtractFrom(clone(lhs), rhs); } + /** + * Subtract rhs from lhs and reset any negative + * values to zero. + * @param lhs {@link Resource} to subtract from + * @param rhs {@link Resource} to subtract + * @return the value of lhs after subtraction + */ + public static Resource subtractFromNonNegative(Resource lhs, Resource rhs) { + subtractFrom(lhs, rhs); + if (lhs.getMemorySize() < 0) { + lhs.setMemorySize(0); + } + if (lhs.getVirtualCores() < 0) { + lhs.setVirtualCores(0); + } + return lhs; + } + public static Resource negate(Resource resource) { return subtract(NONE, resource); } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerNode.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerNode.java index a494b7c..8403b96 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerNode.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerNode.java @@ -292,7 +292,7 @@ private synchronized void addAvailableResource(Resource resource) { return; } Resources.addTo(availableResource, resource); - Resources.subtractFrom(usedResource, resource); + Resources.subtractFromNonNegative(usedResource, resource); } private synchronized void deductAvailableResource(Resource resource) { @@ -301,7 +301,7 @@ private synchronized void deductAvailableResource(Resource resource) { + rmNode.getNodeAddress()); return; } - Resources.subtractFrom(availableResource, resource); + Resources.subtractFromNonNegative(availableResource, resource); Resources.addTo(usedResource, resource); } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSAppAttempt.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSAppAttempt.java index 44d2b42..375c329 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSAppAttempt.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSAppAttempt.java @@ -194,7 +194,7 @@ private void subtractResourcesOnBlacklistedNodes( for (NodeId nodeId: blacklistNodeIds) { SchedulerNode node = scheduler.getSchedulerNode(nodeId); if (node != null) { - Resources.subtractFrom(availableResources, + Resources.subtractFromNonNegative(availableResources, node.getAvailableResource()); } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSLeafQueue.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSLeafQueue.java index 87a5448..f58fc24 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSLeafQueue.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSLeafQueue.java @@ -129,7 +129,7 @@ public boolean removeApp(FSAppAttempt app) { // Update AM resource usage if needed. If isAMRunning is true, we're not // running an unmanaged AM. if (runnable && app.isAmRunning()) { - Resources.subtractFrom(amResourceUsage, app.getAMResource()); + Resources.subtractFromNonNegative(amResourceUsage, app.getAMResource()); } return runnable; diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java index 1586a49..a5e7e70 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java @@ -442,7 +442,8 @@ protected void preemptResources(Resource toPreempt) { container.getState() == RMContainerState.ALLOCATED) && isResourceGreaterThanNone(toPreempt)) { warnOrKillContainer(container); - Resources.subtractFrom(toPreempt, container.getContainer().getResource()); + Resources.subtractFromNonNegative( + toPreempt, container.getContainer().getResource()); } else { warnedIter.remove(); } @@ -462,7 +463,7 @@ protected void preemptResources(Resource toPreempt) { } else { warnOrKillContainer(container); warnedContainers.add(container); - Resources.subtractFrom( + Resources.subtractFromNonNegative( toPreempt, container.getContainer().getResource()); } } @@ -532,13 +533,15 @@ protected Resource resourceDeficit(FSLeafQueue sched, long curTime) { Resource target = Resources.componentwiseMin( sched.getMinShare(), sched.getDemand()); resDueToMinShare = Resources.max(calc, clusterResource, - Resources.none(), Resources.subtract(target, sched.getResourceUsage())); + Resources.none(), + Resources.subtractFromNonNegative(target, sched.getResourceUsage())); } if (curTime - sched.getLastTimeAtFairShareThreshold() > fairShareTimeout) { Resource target = Resources.componentwiseMin( sched.getFairShare(), sched.getDemand()); resDueToFairShare = Resources.max(calc, clusterResource, - Resources.none(), Resources.subtract(target, sched.getResourceUsage())); + Resources.none(), + Resources.subtractFromNonNegative(target, sched.getResourceUsage())); } Resource deficit = Resources.max(calc, clusterResource, resDueToMinShare, resDueToFairShare); @@ -910,7 +913,7 @@ private synchronized void removeNode(RMNode rmNode) { if (node == null) { return; } - Resources.subtractFrom(clusterResource, node.getTotalResource()); + Resources.subtractFromNonNegative(clusterResource, node.getTotalResource()); updateRootQueueMetrics(); triggerUpdate();