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/FSAppAttempt.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/FSAppAttempt.java index 0305702fb5f..f833047a71f 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/FSAppAttempt.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/FSAppAttempt.java @@ -75,6 +75,7 @@ = new DefaultResourceCalculator(); private final long startTime; + private long lastSchedulingTime; private final Priority appPriority; private Resource demand = Resources.createResource(0); private final FairScheduler scheduler; @@ -1302,6 +1303,14 @@ public long getStartTime() { return startTime; } + public long getLastSchedulingTime() { + return lastSchedulingTime; + } + + public void setLastSchedulingTime(long lastSchedulingTime) { + this.lastSchedulingTime = lastSchedulingTime; + } + @Override public Resource getMinShare() { return Resources.none(); 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/FSQueue.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/FSQueue.java index 4babfd5659a..77ddcee727d 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/FSQueue.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/FSQueue.java @@ -63,7 +63,8 @@ private final YarnAuthorizationProvider authorizer; private final PrivilegedEntity queueEntity; private final FSQueueMetrics metrics; - + private long lastSchedulingTime; + protected final FSParentQueue parent; protected final RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory(null); @@ -92,6 +93,7 @@ public FSQueue(String name, FairScheduler scheduler, FSParentQueue parent) { this.queueEntity = new PrivilegedEntity(EntityType.QUEUE, name); this.metrics = FSQueueMetrics.forQueue(getName(), parent, true, scheduler.getConf()); this.parent = parent; + this.lastSchedulingTime = 0L; setPolicy(scheduler.getAllocationConfiguration().getSchedulingPolicy(name)); reinit(false); } @@ -212,6 +214,14 @@ public long getStartTime() { return 0; } + public long getLastSchedulingTime() { + return lastSchedulingTime; + } + + public void setLastSchedulingTime(long lastSchedulingTime) { + this.lastSchedulingTime = lastSchedulingTime; + } + @Override public Priority getPriority() { Priority p = recordFactory.newRecordInstance(Priority.class); 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/FairSchedulerConfiguration.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/FairSchedulerConfiguration.java index b50e4bbe317..fb7cc35c1e0 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/FairSchedulerConfiguration.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/FairSchedulerConfiguration.java @@ -213,6 +213,16 @@ CONF_PREFIX + "reservable-nodes"; public static final float RESERVABLE_NODES_DEFAULT = 0.05f; + /** The deadLineEnable for queue scheduler in FairScheduler .*/ + public static final String QUEUE_SCHEDULING_DEADLINE_ENABLED = CONF_PREFIX + + "queue-scheduler-deadline_enabled"; + public static final boolean DEFAULT_QUEUE_SCHEDULING_DEADLINE_ENABLED = false; + + /** The deadLine for queue scheduler in FairScheduler .*/ + public static final String QUEUE_SCHEDULER_DEADLINE = CONF_PREFIX + + "queue-scheduler-deadline"; + public static final int DEFAULT_QUEUE_SCHEDULER_DEADLINE = 10000; + public FairSchedulerConfiguration() { super(); } @@ -406,6 +416,15 @@ public float getReservableNodes() { return getFloat(RESERVABLE_NODES, RESERVABLE_NODES_DEFAULT); } + public boolean isQueueSchedulingDeadLineEnabled() { + return getBoolean(QUEUE_SCHEDULING_DEADLINE_ENABLED, + DEFAULT_QUEUE_SCHEDULING_DEADLINE_ENABLED); + } + + public int getQueueSchedulingDeadLine() { + return getInt(QUEUE_SCHEDULER_DEADLINE, DEFAULT_QUEUE_SCHEDULER_DEADLINE); + } + /** * Parses a resource config value of a form like "1024", "1024 mb", * or "1024 mb, 3 vcores". If no units are given, megabytes are assumed. 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/Schedulable.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/Schedulable.java index bd1ff7ada25..511da181048 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/Schedulable.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/Schedulable.java @@ -104,4 +104,11 @@ * false otherwise */ boolean isPreemptable(); + + /** Get the last schedulingTime of this Schedulable. */ + long getLastSchedulingTime(); + + /** Assign the last schedulingTime to this Schedulable. */ + void setLastSchedulingTime(long lastSchedulingTime); + } 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 8179aa75033..7f5e89998d8 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 @@ -27,6 +27,8 @@ import org.apache.hadoop.classification.InterfaceStability.Unstable; import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.api.records.ResourceInformation; +import org.apache.hadoop.yarn.conf.YarnConfiguration; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairSchedulerConfiguration; 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; @@ -51,6 +53,13 @@ private static final FairShareComparator COMPARATOR = new FairShareComparator(); + private static FairSchedulerConfiguration fsConf = + new FairSchedulerConfiguration(new YarnConfiguration()); + private static boolean queueSchedulingDeadLineEnabled = + fsConf.isQueueSchedulingDeadLineEnabled(); + private static int queueSchedulingDeadLine = + fsConf.getQueueSchedulingDeadLine(); + @Override public String getName() { return NAME; @@ -87,6 +96,33 @@ public String getName() { @Override public int compare(Schedulable s1, Schedulable s2) { + long currentTime = System.currentTimeMillis(); + if(queueSchedulingDeadLineEnabled && + s1 instanceof FSQueue && s2 instanceof FSQueue) { + long s1LastSchedulingTime = s1.getLastSchedulingTime(); + long s2LastSchedulingTime = s2.getLastSchedulingTime(); + + if(s1LastSchedulingTime == 0L) { + s1.setLastSchedulingTime(currentTime); + } + if(s2LastSchedulingTime == 0L) { + s2.setLastSchedulingTime(currentTime); + } + + if(currentTime - s1LastSchedulingTime > queueSchedulingDeadLine + && currentTime - s2LastSchedulingTime <= queueSchedulingDeadLine) { + //enforce scheduler s1 + s1.setLastSchedulingTime(currentTime); + return -1; + } + if(currentTime - s1LastSchedulingTime <= queueSchedulingDeadLine + && currentTime - s2LastSchedulingTime > queueSchedulingDeadLine) { + //enforce scheduler s2 + s2.setLastSchedulingTime(currentTime); + return 1; + } + } + int res = compareDemand(s1, s2); // Pre-compute resource usages to avoid duplicate calculation @@ -111,6 +147,12 @@ public int compare(Schedulable s1, Schedulable s2) { res = s1.getName().compareTo(s2.getName()); } + if(res < 0) { + s1.setLastSchedulingTime(currentTime); + } else { + s2.setLastSchedulingTime(currentTime); + } + return res; } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FakeSchedulable.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FakeSchedulable.java index 03332b25e2c..fac7692f310 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FakeSchedulable.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FakeSchedulable.java @@ -34,6 +34,7 @@ private float weights; private Priority priority; private long startTime; + private long lastSchedulingTime; public FakeSchedulable() { this(0, Integer.MAX_VALUE, 1, 0, 0, 0); @@ -120,6 +121,14 @@ public Resource getResourceUsage() { public long getStartTime() { return startTime; } + + public long getLastSchedulingTime() { + return lastSchedulingTime; + } + + public void setLastSchedulingTime(long lastSchedulingTime) { + this.lastSchedulingTime = lastSchedulingTime; + } @Override public float getWeight() { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestSchedulingPolicy.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestSchedulingPolicy.java index b016c1b4fb8..80a2fcdcba1 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestSchedulingPolicy.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestSchedulingPolicy.java @@ -219,6 +219,7 @@ private void swap(Schedulable[] array, int x, int y) { private Resource demand; private String name; private long startTime; + private long lastSchedulingTime; private Resource usage; private float weights; @@ -262,6 +263,14 @@ public long getStartTime() { return startTime; } + public long getLastSchedulingTime() { + return lastSchedulingTime; + } + + public void setLastSchedulingTime(long lastSchedulingTime) { + this.lastSchedulingTime = lastSchedulingTime; + } + @Override public Resource getMaxShare() { throw new UnsupportedOperationException();