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 04dbd2f..69b9f7e 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 @@ -26,6 +26,8 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.Set; +import java.util.TreeSet; import com.google.common.annotations.VisibleForTesting; import org.apache.commons.logging.Log; @@ -314,19 +316,20 @@ public Resource assignContainer(FSSchedulerNode node) { return assigned; } - Comparator comparator = policy.getComparator(); - writeLock.lock(); - try { - Collections.sort(runnableApps, comparator); - } finally { - writeLock.unlock(); - } - // Release write lock here for better performance and avoiding deadlocks. - // runnableApps can be in unsorted state because of this section, - // but we can accept it in practice since the probability is low. + // Apps that have resource demands. + Set pendingForResourceApps = + new TreeSet(policy.getComparator()); readLock.lock(); try { - for (FSAppAttempt sched : runnableApps) { + for (FSAppAttempt app : runnableApps) { + // Either memory or vCores > 0, we believe it has resource request. + Resource pending = app.getAppAttemptResourceUsage().getPending(); + if (pending.getMemory() > Resources.none().getMemory() || + pending.getVirtualCores() > Resources.none().getVirtualCores()) { + pendingForResourceApps.add(app); + } + } + for (FSAppAttempt sched : pendingForResourceApps) { if (SchedulerAppUtils.isBlacklisted(sched, node, LOG)) { continue; }