Index: 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 (revision 9349) +++ 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 (working copy) @@ -26,6 +26,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.Iterator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -569,10 +570,19 @@ } } + //ADD:we need to write a new one, add resource check ResourceRequest rackLocalRequest = getResourceRequest(priority, node.getRackName()); + if (rackLocalRequest != null && !getQueue().checkQueueResourceLimit(rackLocalRequest.getCapability()) ) { + rackLocalRequest = null; + } + + //ADD: also need a new one for resource check ResourceRequest localRequest = getResourceRequest(priority, node.getNodeName()); + if (localRequest != null && !getQueue().checkQueueResourceLimit(localRequest.getCapability()) ) { + localRequest = null; + } if (localRequest != null && !localRequest.getRelaxLocality()) { LOG.warn("Relax locality off is not supported on local request: " @@ -608,9 +618,14 @@ return assignContainer(node, rackLocalRequest, NodeType.RACK_LOCAL, reserved); } + + //ADD: we need to add a checking function, for resource limit + ResourceRequest offSwitchRequest = null; + Map resourceRequestList = getResourceRequests(priority); + if(resourceRequestList != null) { + offSwitchRequest = getRequestByQResourceLimit(resourceRequestList); + } - ResourceRequest offSwitchRequest = - getResourceRequest(priority, ResourceRequest.ANY); if (offSwitchRequest != null && !offSwitchRequest.getRelaxLocality()) { continue; } @@ -626,6 +641,27 @@ } /** + * location: resource requests in a application -> a priority;
+ * choose a resource request depending on the queue's resource limit check + * @param resourceRequestList + * @return + */ + @SuppressWarnings("rawtypes") + private ResourceRequest getRequestByQResourceLimit( + Map resourceRequestList) { + Iterator iter = resourceRequestList.entrySet().iterator(); + while( iter.hasNext() ) { + Map.Entry entry = (Map.Entry)iter.next(); + ResourceRequest rRequest = (ResourceRequest) entry.getValue(); + if ( getQueue().checkQueueResourceLimit(rRequest.getCapability()) ) { + return rRequest; + } + } + return null; + } + + + /** * Called when this application already has an existing reservation on the * given node. Sees whether we can turn the reservation into an allocation. * Also checks whether the application needs the reservation anymore, and Index: 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 (revision 9349) +++ 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 (working copy) @@ -267,6 +267,21 @@ } /** + * helper method to check if this resource request should be assigned
+ * this check based on a equation: resourceRequest + resourceUsed should be less than resourceMaxLimit + * @param resource + * @return + */ + public boolean checkQueueResourceLimit(Resource resource) { + Resource resourceWillUse = Resources.add(resource, getResourceUsage()); + if ( !Resources.fitsIn( resourceWillUse, + scheduler.getAllocationConfiguration().getMaxResources(getName())) ) { + return false; + } + return true; + } + + /** * Returns true if queue has at least one app running. */ public boolean isActive() {