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..a58b70f 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,13 @@ 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); + ResourceCalculator calc = + (policy instanceof DominantResourceFairnessPolicy) ? + FairScheduler.DOMINANT_RESOURCE_CALCULATOR + : scheduler.getResourceCalculator(); + Resource desiredShare = Resources.min(calc, scheduler.getClusterResource(), + share, getDemand()); + return Resources.lessThan(calc, 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..507a709 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,24 @@ protected Resource resToPreempt(FSLeafQueue sched, long curTime) { long fairShareTimeout = sched.getFairSharePreemptionTimeout(); Resource resDueToMinShare = Resources.none(); Resource resDueToFairShare = Resources.none(); + boolean isDRF = sched.getPolicy() instanceof DominantResourceFairnessPolicy; + ResourceCalculator calc = + isDRF ? DOMINANT_RESOURCE_CALCULATOR : RESOURCE_CALCULATOR; 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