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 7c9b11e..befc575 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 @@ -264,29 +264,27 @@ public Resource getAmResourceUsage() { public void updateDemand() { // Compute demand by iterating through apps in the queue // Limit demand to maxResources - Resource maxRes = scheduler.getAllocationConfiguration() - .getMaxResources(getName()); demand = Resources.createResource(0); readLock.lock(); try { for (FSAppAttempt sched : runnableApps) { - if (Resources.equals(demand, maxRes)) { + if (Resources.equals(demand, maxShare)) { break; } - updateDemandForApp(sched, maxRes); + updateDemandForApp(sched, maxShare); } for (FSAppAttempt sched : nonRunnableApps) { - if (Resources.equals(demand, maxRes)) { + if (Resources.equals(demand, maxShare)) { break; } - updateDemandForApp(sched, maxRes); + updateDemandForApp(sched, maxShare); } } finally { readLock.unlock(); } if (LOG.isDebugEnabled()) { LOG.debug("The updated demand for " + getName() + " is " + demand - + "; the max is " + maxRes); + + "; the max is " + maxShare); LOG.debug("The updated fairshare for " + getName() + " is " + getFairShare()); } @@ -486,8 +484,6 @@ public ActiveUsersManager getActiveUsersManager() { * @return true if this queue can run */ public boolean canRunAppAM(Resource amResource) { - float maxAMShare = - scheduler.getAllocationConfiguration().getQueueMaxAMShare(getName()); if (Math.abs(maxAMShare - -1.0f) < 0.0001) { 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/FSParentQueue.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSParentQueue.java index 035c60c..e58c3f1 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSParentQueue.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSParentQueue.java @@ -152,8 +152,6 @@ public Resource getResourceUsage() { public void updateDemand() { // Compute demand by iterating through apps in the queue // Limit demand to maxResources - Resource maxRes = scheduler.getAllocationConfiguration() - .getMaxResources(getName()); writeLock.lock(); try { demand = Resources.createResource(0); @@ -166,8 +164,8 @@ public void updateDemand() { " now " + demand); } demand = Resources.add(demand, toAdd); - demand = Resources.componentwiseMin(demand, maxRes); - if (Resources.equals(demand, maxRes)) { + demand = Resources.componentwiseMin(demand, maxShare); + if (Resources.equals(demand, maxShare)) { break; } } @@ -176,7 +174,7 @@ public void updateDemand() { } if (LOG.isDebugEnabled()) { LOG.debug("The updated demand for " + getName() + " is " + demand + - "; the max is " + maxRes); + "; the max is " + maxShare); } } 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/FSQueue.java 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 25554dd..b825f63 100644 --- 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 +++ 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 @@ -59,6 +59,12 @@ protected SchedulingPolicy policy = SchedulingPolicy.DEFAULT_POLICY; + protected ResourceWeights weights; + protected Resource minShare; + protected Resource maxShare; + protected int maxRunningApps; + protected float maxAMShare; + private long fairSharePreemptionTimeout = Long.MAX_VALUE; private long minSharePreemptionTimeout = Long.MAX_VALUE; private float fairSharePreemptionThreshold = 0.5f; @@ -67,14 +73,21 @@ public FSQueue(String name, FairScheduler scheduler, FSParentQueue parent) { this.name = name; this.scheduler = scheduler; - this.metrics = FSQueueMetrics.forQueue(getName(), parent, true, scheduler.getConf()); - metrics.setMinShare(getMinShare()); - metrics.setMaxShare(getMaxShare()); AllocationConfiguration allocConf = scheduler.getAllocationConfiguration(); - metrics.setMaxApps(allocConf.getQueueMaxApps(name)); - metrics.setSchedulingPolicy(allocConf.getSchedulingPolicy(name).getName()); + this.weights = allocConf.getQueueWeight(name); + this.minShare = allocConf.getMinResources(name); + this.maxShare = allocConf.getMaxResources(name); + this.maxRunningApps = allocConf.getQueueMaxApps(name); + this.maxAMShare = allocConf.getQueueMaxAMShare(name); + this.policy = allocConf.getSchedulingPolicy(name); this.parent = parent; + + this.metrics = FSQueueMetrics.forQueue(getName(), parent, true, scheduler.getConf()); + metrics.setMinShare(minShare); + metrics.setMaxShare(maxShare); + metrics.setMaxApps(maxRunningApps); + metrics.setSchedulingPolicy(policy.getName()); } public String getName() { @@ -103,19 +116,47 @@ protected void throwPolicyDoesnotApplyException(SchedulingPolicy policy) public abstract void setPolicy(SchedulingPolicy policy) throws AllocationConfigurationException; + public void setWeights(ResourceWeights weights){ + this.weights = weights; + } + @Override public ResourceWeights getWeights() { - return scheduler.getAllocationConfiguration().getQueueWeight(getName()); + return weights; } - + + public void setMinShare(Resource minShare){ + this.minShare = minShare; + } + @Override public Resource getMinShare() { - return scheduler.getAllocationConfiguration().getMinResources(getName()); + return minShare; } - + + public void setMaxShare(Resource maxShare){ + this.maxShare = maxShare; + } + @Override public Resource getMaxShare() { - return scheduler.getAllocationConfiguration().getMaxResources(getName()); + return maxShare; + } + + public void setMaxRunningApps(int maxRunningApps){ + this.maxRunningApps = maxRunningApps; + } + + public int getMaxRunningApps() { + return maxRunningApps; + } + + public void setMaxAMShare(float maxAMShare){ + this.maxAMShare = maxAMShare; + } + + public float getMaxAMShare() { + return maxAMShare; } @Override @@ -302,8 +343,7 @@ public abstract void collectSchedulerApplications( * @return true if check passes (can assign) or false otherwise */ protected boolean assignContainerPreCheck(FSSchedulerNode node) { - if (!Resources.fitsIn(getResourceUsage(), - scheduler.getAllocationConfiguration().getMaxResources(getName())) + if (!Resources.fitsIn(getResourceUsage(), maxShare) || node.getReservedContainer() != null) { return false; } 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/FairScheduler.java 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 bc953ba..79db9df 100644 --- 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 +++ 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 @@ -1634,7 +1634,7 @@ private void verifyMoveDoesNotViolateConstraints(FSAppAttempt app, FSQueue cur = targetQueue; while (cur != lowestCommonAncestor) { // maxRunningApps - if (cur.getNumRunnableApps() == allocConf.getQueueMaxApps(cur.getQueueName())) { + if (cur.getNumRunnableApps() == cur.getMaxRunningApps()) { throw new YarnException("Moving app attempt " + appAttId + " to queue " + queueName + " would violate queue maxRunningApps constraints on" + " queue " + cur.getQueueName()); 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/MaxRunningAppsEnforcer.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/MaxRunningAppsEnforcer.java index f750438..8592fa6 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/MaxRunningAppsEnforcer.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/MaxRunningAppsEnforcer.java @@ -66,8 +66,7 @@ public boolean canAppBeRunnable(FSQueue queue, String user) { } // Check queue and all parent queues while (queue != null) { - int queueMaxApps = allocConf.getQueueMaxApps(queue.getName()); - if (queue.getNumRunnableApps() >= queueMaxApps) { + if (queue.getNumRunnableApps() >= queue.getMaxRunningApps()) { return false; } queue = queue.getParent(); @@ -143,11 +142,10 @@ public void updateRunnabilityOnAppRemoval(FSAppAttempt app, FSLeafQueue queue) { // Thus we find the ancestor queue highest in the tree for which the app // that was at its maxRunningApps before the removal. FSQueue highestQueueWithAppsNowRunnable = (queue.getNumRunnableApps() == - allocConf.getQueueMaxApps(queue.getName()) - 1) ? queue : null; + queue.getMaxRunningApps() - 1) ? queue : null; FSParentQueue parent = queue.getParent(); while (parent != null) { - if (parent.getNumRunnableApps() == allocConf.getQueueMaxApps(parent - .getName()) - 1) { + if (parent.getNumRunnableApps() == parent.getMaxRunningApps() - 1) { highestQueueWithAppsNowRunnable = parent; } parent = parent.getParent(); @@ -265,8 +263,7 @@ public void untrackNonRunnableApp(FSAppAttempt app) { */ private void gatherPossiblyRunnableAppLists(FSQueue queue, List> appLists) { - if (queue.getNumRunnableApps() < scheduler.getAllocationConfiguration() - .getQueueMaxApps(queue.getName())) { + if (queue.getNumRunnableApps() < queue.getMaxRunningApps()) { if (queue instanceof FSLeafQueue) { appLists.add( ((FSLeafQueue)queue).getCopyOfNonRunnableAppSchedulables()); 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/QueueManager.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/QueueManager.java index 8d308dc..9bbc10d 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/QueueManager.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/QueueManager.java @@ -431,13 +431,21 @@ public void updateAllocationConfiguration(AllocationConfiguration queueConf) { FSQueueMetrics queueMetrics = queue.getMetrics(); queueMetrics.setMinShare(queue.getMinShare()); queueMetrics.setMaxShare(queue.getMaxShare()); + + //Update queue-specific information + queue.setWeights(queueConf.getQueueWeight(queue.getName())); + queue.setMinShare(queueConf.getMinResources(queue.getName())); + queue.setMaxShare(queueConf.getMaxResources(queue.getName())); + queue.setMaxRunningApps(queueConf.getQueueMaxApps(queue.getName())); + queue.setMaxAMShare(queueConf.getQueueMaxAMShare(queue.getName())); + // Set scheduling policies and update queue metrics try { SchedulingPolicy policy = queueConf.getSchedulingPolicy(queue.getName()); policy.initialize(scheduler.getClusterResource()); queue.setPolicy(policy); - queueMetrics.setMaxApps(queueConf.getQueueMaxApps(queue.getName())); + queueMetrics.setMaxApps(queue.getMaxRunningApps()); queueMetrics.setSchedulingPolicy(policy.getName()); } catch (AllocationConfigurationException ex) { LOG.warn("Cannot apply configured scheduling policy to queue " diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/FairSchedulerQueueInfo.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/FairSchedulerQueueInfo.java index a09b92f..64e573b 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/FairSchedulerQueueInfo.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/FairSchedulerQueueInfo.java @@ -101,7 +101,7 @@ public FairSchedulerQueueInfo(FSQueue queue, FairScheduler scheduler) { fractionMemMinShare = (float)minResources.getMemorySize() / clusterResources.getMemorySize(); fractionMemMaxShare = (float)maxResources.getMemorySize() / clusterResources.getMemorySize(); - maxApps = allocConf.getQueueMaxApps(queueName); + maxApps = queue.getMaxRunningApps(); pendingContainers = queue.getMetrics().getPendingContainers(); allocatedContainers = queue.getMetrics().getAllocatedContainers();