diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ApplicationMasterService.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ApplicationMasterService.java index d77180c..3fbb7dc 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ApplicationMasterService.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ApplicationMasterService.java @@ -490,6 +489,11 @@ public AllocateResponse allocate(AllocateRequest request) LOG.warn("Invalid resource ask by application " + appAttemptId, e); throw e; } + + //update blackListed Resources according to blacklistAddtions and + //blacklistRemovals when AM asks for new containers + (((AbstractYarnScheduler)rScheduler).getApplicationAttempt(appAttemptId)) + .updateBlackListedResource(blacklistAdditions, blacklistRemovals); try { RMServerUtils.validateBlacklistRequest(blacklistRequest); @@ -592,7 +596,7 @@ public AllocateResponse allocate(AllocateRequest request) return allocateResponse; } } - + private PreemptionMessage generatePreemptionMessage(Allocation allocation){ PreemptionMessage pMsg = null; // assemble strict preemption request diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerApplicationAttempt.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerApplicationAttempt.java index 933f456..04af611 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerApplicationAttempt.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerApplicationAttempt.java @@ -70,7 +69,9 @@ .getLog(SchedulerApplicationAttempt.class); protected final AppSchedulingInfo appSchedulingInfo; - + + private Resource blackListedResources; + protected Map liveContainers = new HashMap(); protected final Map> reservedContainers = @@ -470,6 +471,44 @@ public boolean isBlacklisted(String resourceName) { return this.appSchedulingInfo.isBlacklisted(resourceName); } + public Resource getBlackListedResources() { + return this.blackListedResources; + } + + /** + * This method updates resources from blacklist Add-on and remove nodes + * + */ + + public synchronized void updateBlackListedResource( + List blacklistAdditions, List blacklistRemovals) { + + if(blacklistAdditions.size() == 0 && blacklistRemovals.size() == 0) { + return; + } + + int updatedMem = blackListedResources.getMemory(); + int updatedVcore = blackListedResources.getVirtualCores(); + + for(NodeId nodeId: rmContext.getRMNodes().keySet()) { + if(blacklistAdditions.contains(nodeId.getHost())) { + updatedMem += rmContext.getRMNodes() + .get(nodeId).getTotalCapability().getMemory(); + updatedVcore += rmContext.getRMNodes() + .get(nodeId).getTotalCapability().getVirtualCores(); + } + + if(blacklistRemovals.contains(nodeId.getHost())) { + updatedMem -= rmContext.getRMNodes() + .get(nodeId).getTotalCapability().getMemory(); + updatedVcore -= rmContext.getRMNodes() + .get(nodeId).getTotalCapability().getVirtualCores(); + } + } + blackListedResources.setMemory(updatedMem); + blackListedResources.setVirtualCores(updatedVcore); + } + public synchronized void addSchedulingOpportunity(Priority priority) { schedulingOpportunities.setCount(priority, schedulingOpportunities.count(priority) + 1); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java index 5c93c5f..da82b92 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java @@ -966,18 +965,39 @@ private synchronized boolean assignToQueue(Resource clusterResource, return true; } + Resource updateBlackListForApp(FiCaSchedulerApp application, + Resource clusterResource) { + int updatedMem = clusterResource.getMemory(); + int updatedVcore = clusterResource.getVirtualCores(); + if(updatedMem == 0 || updatedVcore == 0){ + return clusterResource; + } + + //update resource from blacklist nodes + Resource blackListedResources = + application.getBlackListedResources(); + updatedMem -= blackListedResources.getMemory(); + updatedVcore -= blackListedResources.getVirtualCores(); + + return Resource.newInstance( + updatedMem<0?0:updatedMem, updatedVcore<0?0:updatedVcore); + } + @Lock({LeafQueue.class, FiCaSchedulerApp.class}) private Resource computeUserLimitAndSetHeadroom( FiCaSchedulerApp application, Resource clusterResource, Resource required) { String user = application.getUser(); - + + Resource resourceWithoutBlacklistNodes = + updateBlackListForApp(application, clusterResource); + /** * Headroom is min((userLimit, queue-max-cap) - consumed) */ Resource userLimit = // User limit - computeUserLimit(application, clusterResource, required); + computeUserLimit(application, resourceWithoutBlacklistNodes, required); //Max avail capacity needs to take into account usage by ancestor-siblings //which are greater than their base capacity, so we are interested in "max avail" @@ -987,15 +1007,15 @@ private Resource computeUserLimitAndSetHeadroom( Resource queueMaxCap = // Queue Max-Capacity Resources.multiplyAndNormalizeDown( - resourceCalculator, - clusterResource, + resourceCalculator, + resourceWithoutBlacklistNodes, absoluteMaxAvailCapacity, minimumAllocation); Resource userConsumed = getUser(user).getConsumedResources(); Resource headroom = Resources.subtract( - Resources.min(resourceCalculator, clusterResource, + Resources.min(resourceCalculator, resourceWithoutBlacklistNodes, userLimit, queueMaxCap), userConsumed);