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/fair/FSLeafQueue.java b/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 6779a1b..1d98788 100644 --- a/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 +++ b/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 @@ -43,6 +43,11 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ActiveUsersManager; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerAppUtils; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerApplicationAttempt; + + +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.policies + .DominantResourceFairnessPolicy; +import org.apache.hadoop.yarn.util.resource.ResourceCalculator; import org.apache.hadoop.yarn.util.resource.Resources; @Private @@ -560,9 +565,9 @@ boolean isStarvedForFairShare() { } private boolean isStarved(Resource share) { - Resource desiredShare = Resources.min(scheduler.getResourceCalculator(), - scheduler.getClusterResource(), share, getDemand()); - return Resources.lessThan(scheduler.getResourceCalculator(), - scheduler.getClusterResource(), getResourceUsage(), desiredShare); + Resource desiredShare = Resources.min(policy.getResourceCalculator(), + scheduler.getClusterResource(), share, getDemand()); + return Resources.lessThan(policy.getResourceCalculator(), + scheduler.getClusterResource(), getResourceUsage(), desiredShare); } } 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/fair/FairScheduler.java b/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 07b3271..41e2ae8 100644 --- a/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 +++ b/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 @@ -81,6 +81,9 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.NodeResourceUpdateSchedulerEvent; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.NodeUpdateSchedulerEvent; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.SchedulerEvent; + +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.policies + .DominantResourceFairnessPolicy; import org.apache.hadoop.yarn.server.resourcemanager.security.RMContainerTokenSecretManager; import org.apache.hadoop.yarn.util.Clock; import org.apache.hadoop.yarn.util.SystemClock; @@ -125,9 +128,9 @@ private static final Log LOG = LogFactory.getLog(FairScheduler.class); - private static final ResourceCalculator RESOURCE_CALCULATOR = + public static final ResourceCalculator RESOURCE_CALCULATOR = new DefaultResourceCalculator(); - private static final ResourceCalculator DOMINANT_RESOURCE_CALCULATOR = + public static final ResourceCalculator DOMINANT_RESOURCE_CALCULATOR = new DominantResourceCalculator(); // Value that container assignment methods return when a container is @@ -479,21 +482,22 @@ protected Resource resToPreempt(FSLeafQueue sched, long curTime) { long fairShareTimeout = sched.getFairSharePreemptionTimeout(); Resource resDueToMinShare = Resources.none(); Resource resDueToFairShare = Resources.none(); + ResourceCalculator calc = sched.getPolicy().getResourceCalculator(); if (curTime - sched.getLastTimeAtMinShare() > minShareTimeout) { - Resource target = Resources.min(RESOURCE_CALCULATOR, clusterResource, + Resource target = Resources.min(calc, clusterResource, sched.getMinShare(), sched.getDemand()); - resDueToMinShare = Resources.max(RESOURCE_CALCULATOR, clusterResource, + resDueToMinShare = Resources.max(calc, clusterResource, Resources.none(), Resources.subtract(target, sched.getResourceUsage())); } if (curTime - sched.getLastTimeAtFairShareThreshold() > fairShareTimeout) { - Resource target = Resources.min(RESOURCE_CALCULATOR, clusterResource, - sched.getFairShare(), sched.getDemand()); - resDueToFairShare = Resources.max(RESOURCE_CALCULATOR, clusterResource, + Resource target = Resources.componentwiseMin( + sched.getFairShare(), sched.getDemand()); + resDueToFairShare = Resources.max(calc, clusterResource, Resources.none(), Resources.subtract(target, sched.getResourceUsage())); } - Resource resToPreempt = Resources.max(RESOURCE_CALCULATOR, clusterResource, + Resource resToPreempt = Resources.max(calc, clusterResource, resDueToMinShare, resDueToFairShare); - if (Resources.greaterThan(RESOURCE_CALCULATOR, clusterResource, + if (Resources.greaterThan(calc, clusterResource, resToPreempt, Resources.none())) { String message = "Should preempt " + resToPreempt + " res for queue " + sched.getName() + ": resDueToMinShare = " + resDueToMinShare 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/fair/SchedulingPolicy.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/SchedulingPolicy.java index abdc834..160ba4b 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/SchedulingPolicy.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/SchedulingPolicy.java @@ -26,6 +26,9 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.policies.FairSharePolicy; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.policies.FifoPolicy; + +import org.apache.hadoop.yarn.util.resource.ResourceCalculator; + import java.util.Collection; import java.util.Comparator; import java.util.concurrent.ConcurrentHashMap; @@ -98,6 +101,14 @@ public static SchedulingPolicy parse(String policy) public void initialize(Resource clusterCapacity) {} /** + * The {@link ResourceCalculator} returned by this method should be used + * for any calculations involving resources. + * + * @return ResourceCalculator instance to use + */ + public abstract ResourceCalculator getResourceCalculator(); + + /** * @return returns the name of {@link SchedulingPolicy} */ public abstract String getName(); 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/fair/policies/DominantResourceFairnessPolicy.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/policies/DominantResourceFairnessPolicy.java index 86d503b..45fbf98 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/policies/DominantResourceFairnessPolicy.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/policies/DominantResourceFairnessPolicy.java @@ -29,6 +29,9 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FSQueue; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.Schedulable; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicy; + +import org.apache.hadoop.yarn.util.resource.DominantResourceCalculator; +import org.apache.hadoop.yarn.util.resource.ResourceCalculator; import org.apache.hadoop.yarn.util.resource.Resources; import static org.apache.hadoop.yarn.server.resourcemanager.resource.ResourceType.*; @@ -44,8 +47,10 @@ public static final String NAME = "DRF"; - private DominantResourceFairnessComparator comparator = + private static final DominantResourceFairnessComparator COMPARATOR = new DominantResourceFairnessComparator(); + private static final DominantResourceCalculator CALCULATOR = + new DominantResourceCalculator(); @Override public String getName() { @@ -59,9 +64,14 @@ public byte getApplicableDepth() { @Override public Comparator getComparator() { - return comparator; + return COMPARATOR; } - + + @Override + public ResourceCalculator getResourceCalculator() { + return CALCULATOR; + } + @Override public void computeShares(Collection schedulables, Resource totalResources) { @@ -105,7 +115,7 @@ public Resource getHeadroom(Resource queueFairShare, Resource queueUsage, @Override public void initialize(Resource clusterCapacity) { - comparator.setClusterCapacity(clusterCapacity); + COMPARATOR.setClusterCapacity(clusterCapacity); } public static class DominantResourceFairnessComparator implements Comparator { 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/fair/policies/FairSharePolicy.java b/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 918db9d..3b9f07f 100644 --- a/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 +++ b/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 @@ -29,6 +29,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.Schedulable; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicy; import org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator; +import org.apache.hadoop.yarn.util.resource.ResourceCalculator; import org.apache.hadoop.yarn.util.resource.Resources; import com.google.common.annotations.VisibleForTesting; @@ -43,7 +44,8 @@ public static final String NAME = "fair"; private static final DefaultResourceCalculator RESOURCE_CALCULATOR = new DefaultResourceCalculator(); - private FairShareComparator comparator = new FairShareComparator(); + private static final FairShareComparator COMPARATOR = + new FairShareComparator(); @Override public String getName() { @@ -111,7 +113,12 @@ else if (s1Needy && s2Needy) @Override public Comparator getComparator() { - return comparator; + return COMPARATOR; + } + + @Override + public ResourceCalculator getResourceCalculator() { + return RESOURCE_CALCULATOR; } @Override 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/fair/policies/FifoPolicy.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/policies/FifoPolicy.java index 7d88933..a644e58 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/policies/FifoPolicy.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/policies/FifoPolicy.java @@ -27,6 +27,10 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FSQueue; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.Schedulable; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicy; + + +import org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator; +import org.apache.hadoop.yarn.util.resource.ResourceCalculator; import org.apache.hadoop.yarn.util.resource.Resources; import com.google.common.annotations.VisibleForTesting; @@ -36,7 +40,9 @@ public class FifoPolicy extends SchedulingPolicy { @VisibleForTesting public static final String NAME = "FIFO"; - private FifoComparator comparator = new FifoComparator(); + private static final FifoComparator COMPARATOR = new FifoComparator(); + private static final DefaultResourceCalculator CALCULATOR = + new DefaultResourceCalculator(); @Override public String getName() { @@ -68,7 +74,12 @@ public int compare(Schedulable s1, Schedulable s2) { @Override public Comparator getComparator() { - return comparator; + return COMPARATOR; + } + + @Override + public ResourceCalculator getResourceCalculator() { + return CALCULATOR; } @Override