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..16045a08b3d 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,35 @@ 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..7beb25b299f 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,49 @@ public static boolean isAnyMajorResourceZero(ResourceCalculator rc, Resource resource) { return rc.isAnyMajorResourceZero(resource); } + + + /** + * Return true if any major resource value in {@code resource} is greater + * than 0 according to {@code rc}. + * + * @param rc the resource calculator to use + * @param res the resource to test + * @return whether the resource has non-zero major resource values + */ + public static boolean isNonZero(ResourceCalculator rc, Resource res) { + return rc.isNonZero(res); + } + + /** + * Return true if any major resource value in {@code lhs} is less than the + * corresponding resource value in {@code rhs} according to {@code rc}. + * Otherwise return false. + * + * @param rc the resource calculator to use + * @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 static boolean anyLessThan(ResourceCalculator rc, Resource lhs, + Resource rhs) { + return rc.anyLessThan(lhs, rhs); + } + + /** + * Return true if any major resource value in {@code lhs} is greater than the + * corresponding resource value in {@code rhs} according to {@code rc}. + * Otherwise return false. + * + * @param rc the resource calculator to use + * @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 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 397d507b045..4eab4e5508b 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,11 +1188,7 @@ public boolean hasPendingResourceRequest(ResourceCalculator rc, unconfirmedAllocatedVcores.get())); } - if (Resources.greaterThan(rc, cluster, pending, Resources.none())) { - return true; - } - - return false; + return Resources.isNonZero(rc, pending); } /* 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 71e6f7fd7df..7317e3becd9 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 @@ -289,7 +289,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 @@ -300,10 +300,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..56491f73fb5 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,13 +563,14 @@ 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 starvation = + Resources.componentwiseMin(getMinShare(), getDemand()); - Resource starvation = Resources.subtract(desiredShare, getResourceUsage()); - boolean starved = !Resources.isNone(starvation); + Resources.subtractFromNonNegative(starvation, getResourceUsage()); + boolean starved = !Resources.isNone(starvation); long now = scheduler.getClock().getTime(); + if (!starved) { // Record that the queue is not starved setLastTimeAtMinShare(now); 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..5e7aa789859 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 @@ -82,7 +82,6 @@ public String getName() { private static class FairShareComparator implements Comparator, Serializable { private static final long serialVersionUID = 5564969375856699313L; - private static final Resource ONE = Resources.createResource(1); @Override public int compare(Schedulable s1, Schedulable s2) { @@ -115,41 +114,44 @@ public int compare(Schedulable s1, Schedulable s2) { 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())) { + long demand1 = s1.getDemand().getMemorySize(); + long demand2 = s2.getDemand().getMemorySize(); + + if ((demand1 == 0) && (demand2 > 0)) { res = 1; - } else if (demand2.equals(Resources.none()) && Resources.greaterThan( - RESOURCE_CALCULATOR, null, demand1, Resources.none())) { + } else if ((demand2 == 0) && (demand1 > 0)) { res = -1; } + return res; } 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, - resourceUsage1, minShare1); - boolean s2Needy = Resources.lessThan(RESOURCE_CALCULATOR, null, - resourceUsage2, minShare2); + long minShare1 = Math.min(s1.getMinShare().getMemorySize(), + s1.getDemand().getMemorySize()); + long minShare2 = Math.min(s2.getMinShare().getMemorySize(), + s2.getDemand().getMemorySize()); + boolean s1Needy = resourceUsage1.getMemorySize() < minShare1; + boolean s2Needy = resourceUsage2.getMemorySize() < minShare2; if (s1Needy && !s2Needy) { res = -1; } 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 > 1) { + minShareRatio1 /= minShare1; + } + + if (minShare2 > 1) { + minShareRatio1 /= minShare2; + } + res = (int) Math.signum(minShareRatio1 - minShareRatio2); } else { res = 0; @@ -225,7 +227,7 @@ public void computeSteadyShares(Collection queues, @Override public boolean checkIfUsageOverFairShare(Resource usage, Resource fairShare) { - return Resources.greaterThan(RESOURCE_CALCULATOR, null, usage, fairShare); + return usage.getMemorySize() > fairShare.getMemorySize(); } @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"));