diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DefaultResourceCalculator.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DefaultResourceCalculator.java index bdf60bd9a5b..94e00ca75c5 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DefaultResourceCalculator.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DefaultResourceCalculator.java @@ -130,6 +130,21 @@ public boolean fitsIn(Resource cluster, @Override public boolean isAnyMajorResourceZero(Resource resource) { - return resource.getMemorySize() == 0f; + return resource.getMemorySize() == 0; + } + + @Override + public boolean isNonZero(Resource resource) { + return resource.getMemorySize() > 0; + } + + @Override + public boolean anyLessThan(Resource lhs, Resource rhs) { + return lhs.getMemorySize() < rhs.getMemorySize(); + } + + @Override + public boolean anyGreaterThan(Resource lhs, Resource rhs) { + return lhs.getMemorySize() > rhs.getMemorySize(); } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DominantResourceCalculator.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DominantResourceCalculator.java index 7697e1dfc33..a9a08c1a3e2 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DominantResourceCalculator.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DominantResourceCalculator.java @@ -242,6 +242,23 @@ public boolean fitsIn(Resource cluster, @Override public boolean isAnyMajorResourceZero(Resource resource) { - return resource.getMemorySize() == 0f || resource.getVirtualCores() == 0; + return resource.getMemorySize() == 0 || resource.getVirtualCores() == 0; + } + + @Override + public boolean isNonZero(Resource resource) { + return (resource.getMemorySize() > 0) || (resource.getVirtualCores() > 0); + } + + @Override + public boolean anyLessThan(Resource lhs, Resource rhs) { + return (lhs.getMemorySize() < rhs.getMemorySize()) || + (lhs.getVirtualCores() < rhs.getVirtualCores()); + } + + @Override + public boolean anyGreaterThan(Resource lhs, Resource rhs) { + return (lhs.getMemorySize() > rhs.getMemorySize()) || + (lhs.getVirtualCores() > rhs.getVirtualCores()); } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceCalculator.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceCalculator.java index 398dac50fa5..ae89b148fe3 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceCalculator.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceCalculator.java @@ -236,4 +236,32 @@ public abstract boolean fitsIn(Resource cluster, * @return returns true if any resource is zero. */ public abstract boolean isAnyMajorResourceZero(Resource resource); + + /** + * Return true if any major resource value in {@code resource} is greater + * than 0. + * @param resource the resource to test + * @return whether the resource has non-zero major resource values + */ + public abstract boolean isNonZero(Resource resource); + + /** + * Return true if any major resource value in {@code lhs} is less than the + * corresponding resource value in {@code rhs}. Otherwise return false. + * @param lhs the first resource + * @param rhs the second resource + * @return whether the first resource is less than the second resource in any + * resource value + */ + public abstract boolean anyLessThan(Resource lhs, Resource rhs); + + /** + * Return true if any major resource value in {@code lhs} is greater than the + * corresponding resource value in {@code rhs}. Otherwise return false. + * @param lhs the first resource + * @param rhs the second resource + * @return whether the first resource is greater than the second resource in + * any resource value + */ + public abstract boolean anyGreaterThan(Resource lhs, Resource rhs); } 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 a1d14fdce73..f6f536603be 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 @@ -146,7 +146,7 @@ public static Resource none() { public static boolean isNone(Resource other) { return NONE.equals(other); } - + public static Resource unbounded() { return UNBOUNDED; } @@ -355,4 +355,18 @@ public static boolean isAnyMajorResourceZero(ResourceCalculator rc, Resource resource) { return rc.isAnyMajorResourceZero(resource); } + + public static boolean isNonZero(ResourceCalculator rc, Resource res) { + return rc.isNonZero(res); + } + + public static boolean anyLessThan(ResourceCalculator rc, Resource lhs, + Resource rhs) { + return rc.anyLessThan(lhs, rhs); + } + + public static boolean anyGreaterThan(ResourceCalculator rc, Resource lhs, + Resource rhs) { + return rc.anyGreaterThan(lhs, rhs); + } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerApplicationAttempt.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerApplicationAttempt.java index 8b2f9db927b..9d1beb74850 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerApplicationAttempt.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerApplicationAttempt.java @@ -1188,7 +1188,7 @@ public boolean hasPendingResourceRequest(ResourceCalculator rc, unconfirmedAllocatedVcores.get())); } - if (Resources.greaterThan(rc, cluster, pending, Resources.none())) { + if (Resources.isNonZero(rc, pending)) { return true; } 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/AllocationConfiguration.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/AllocationConfiguration.java index f143aa65043..92f171cdc73 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/AllocationConfiguration.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/AllocationConfiguration.java @@ -292,7 +292,7 @@ Resource getMinResources(String queue) { } /** - * Get the maximum resource allocation for the given queue. If the max in not + * Get the maximum resource allocation for the given queue. If the max is not * set, return the larger of the min and the default max. * * @param queue the target queue's name @@ -303,10 +303,9 @@ Resource getMaxResources(String queue) { Resource maxQueueResource = maxQueueResources.get(queue); if (maxQueueResource == null) { Resource minQueueResource = minQueueResources.get(queue); - if (minQueueResource != null && - Resources.greaterThan(RESOURCE_CALCULATOR, Resources.unbounded(), - minQueueResource, queueMaxResourcesDefault)) { - return minQueueResource; + if (minQueueResource != null) { + return Resources.componentwiseMax(minQueueResource, + queueMaxResourcesDefault); } else { return queueMaxResourcesDefault; } 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 5dfef731e20..26fdff372b5 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 @@ -1043,8 +1043,7 @@ private boolean hasContainerForNode(SchedulerRequestKey key, (!hasRequestForRack || appSchedulingInfo.canDelayTo(key, node.getRackName()) || (hasRequestForNode)) && // The requested container must be able to fit on the node: - Resources.lessThanOrEqual(RESOURCE_CALCULATOR, null, - resource, + Resources.fitsIn(resource, node.getRMNode().getTotalCapability()))) { ret = false; } else if (!getQueue().fitsInMaxShare(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/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 b911a1ae71a..746bd346fab 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 @@ -563,11 +563,12 @@ public void setWeights(float weight) { */ private Resource minShareStarvation() { // If demand < minshare, we should use demand to determine starvation - Resource desiredShare = Resources.min(policy.getResourceCalculator(), - scheduler.getClusterResource(), getMinShare(), getDemand()); + Resource desiredShare = + Resources.componentwiseMin(getMinShare(), getDemand()); Resource starvation = Resources.subtract(desiredShare, getResourceUsage()); - boolean starved = !Resources.isNone(starvation); + boolean starved = !Resources.isNonZero(policy.getResourceCalculator(), + starvation); long now = scheduler.getClock().getTime(); if (!starved) { 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/policies/FairSharePolicy.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/policies/FairSharePolicy.java index 0ef90a1d72f..3c000c288fa 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/policies/FairSharePolicy.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/policies/FairSharePolicy.java @@ -117,11 +117,11 @@ private int compareDemand(Schedulable s1, Schedulable s2) { int res = 0; Resource demand1 = s1.getDemand(); Resource demand2 = s2.getDemand(); - if (demand1.equals(Resources.none()) && Resources.greaterThan( - RESOURCE_CALCULATOR, null, demand2, Resources.none())) { + if (Resources.isNone(demand1) && + Resources.isNonZero(RESOURCE_CALCULATOR, demand2)) { res = 1; - } else if (demand2.equals(Resources.none()) && Resources.greaterThan( - RESOURCE_CALCULATOR, null, demand1, Resources.none())) { + } else if (Resources.isNone(demand2) && + Resources.isNonZero(RESOURCE_CALCULATOR, demand1)) { res = -1; } return res; @@ -130,13 +130,13 @@ private int compareDemand(Schedulable s1, Schedulable s2) { private int compareMinShareUsage(Schedulable s1, Schedulable s2, Resource resourceUsage1, Resource resourceUsage2) { int res; - Resource minShare1 = Resources.min(RESOURCE_CALCULATOR, null, - s1.getMinShare(), s1.getDemand()); - Resource minShare2 = Resources.min(RESOURCE_CALCULATOR, null, - s2.getMinShare(), s2.getDemand()); - boolean s1Needy = Resources.lessThan(RESOURCE_CALCULATOR, null, + Resource minShare1 = Resources.componentwiseMin(s1.getMinShare(), + s1.getDemand()); + Resource minShare2 = Resources.componentwiseMin(s2.getMinShare(), + s2.getDemand()); + boolean s1Needy = Resources.anyLessThan(RESOURCE_CALCULATOR, resourceUsage1, minShare1); - boolean s2Needy = Resources.lessThan(RESOURCE_CALCULATOR, null, + boolean s2Needy = Resources.anyLessThan(RESOURCE_CALCULATOR, resourceUsage2, minShare2); if (s1Needy && !s2Needy) { @@ -144,12 +144,17 @@ private int compareMinShareUsage(Schedulable s1, Schedulable s2, } else if (s2Needy && !s1Needy) { res = 1; } else if (s1Needy && s2Needy) { - double minShareRatio1 = (double) resourceUsage1.getMemorySize() / - Resources.max(RESOURCE_CALCULATOR, null, minShare1, ONE) - .getMemorySize(); - double minShareRatio2 = (double) resourceUsage2.getMemorySize() / - Resources.max(RESOURCE_CALCULATOR, null, minShare2, ONE) - .getMemorySize(); + double minShareRatio1 = (double) resourceUsage1.getMemorySize(); + double minShareRatio2 = (double) resourceUsage2.getMemorySize(); + + if (minShare1.getMemorySize() > 1) { + minShareRatio1 /= minShare1.getMemorySize(); + } + + if (minShare2.getMemorySize() > 1) { + minShareRatio1 /= minShare2.getMemorySize(); + } + res = (int) Math.signum(minShareRatio1 - minShareRatio2); } else { res = 0; @@ -225,7 +230,7 @@ public void computeSteadyShares(Collection queues, @Override public boolean checkIfUsageOverFairShare(Resource usage, Resource fairShare) { - return Resources.greaterThan(RESOURCE_CALCULATOR, null, usage, fairShare); + return Resources.anyGreaterThan(RESOURCE_CALCULATOR, usage, fairShare); } @Override diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestAllocationFileLoaderService.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestAllocationFileLoaderService.java index c8b9ad8bdef..9ffc5ff98e5 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestAllocationFileLoaderService.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestAllocationFileLoaderService.java @@ -238,7 +238,7 @@ public void testAllocationFileParsing() throws Exception { queueConf.getMaxResources("root.queueA")); assertEquals(Resources.createResource(5120, 110), queueConf.getMaxResources("root.queueB")); - assertEquals(Resources.createResource(5120, 0), + assertEquals(Resources.createResource(5120, 100), queueConf.getMaxResources("root.queueC")); assertEquals(Resources.createResource(4096, 100), queueConf.getMaxResources("root.queueD"));