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/FSPreemptionThread.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/FSPreemptionThread.java index 6ed90f816a5..6b0de716e35 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/FSPreemptionThread.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/FSPreemptionThread.java @@ -120,14 +120,14 @@ public void run() { PreemptableContainers bestContainers = identifyContainersToPreemptForOneContainer(potentialNodes, rr); - // Don't preempt AM containers just to satisfy local requests if relax - // locality is enabled. - if (bestContainers != null - && bestContainers.numAMContainers > 0 - && !ResourceRequest.isAnyLocation(rr.getResourceName()) - && rr.getRelaxLocality()) { + if (rr.getRelaxLocality() + && !ResourceRequest.isAnyLocation(rr.getResourceName()) + && bestContainers == null) { + List nodesToCheck = + scheduler.getNodeTracker().getAllNodes(); + nodesToCheck.removeAll(potentialNodes); bestContainers = identifyContainersToPreemptForOneContainer( - scheduler.getNodeTracker().getAllNodes(), rr); + nodesToCheck, rr); } if (bestContainers != null) { @@ -171,6 +171,12 @@ private PreemptableContainers identifyContainersToPreemptForOneContainer( } } } + + // AM containers can't be preempted, otherwise the app will failed. + if (maxAMContainers > 0) { + bestContainers = null; + } + return bestContainers; }