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/FSLeafQueue.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/FSLeafQueue.java index 04dbd2f..82bab13 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/FSLeafQueue.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/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; @@ -55,6 +57,10 @@ private final List nonRunnableApps = new ArrayList(); // get a lock with fair distribution for app list updates + Comparator schedulableComparator = policy.getComparator(); + // apps that have resource demands. + private final Set pendingForResourceApps = + new TreeSet(schedulableComparator); private final ReadWriteLock rwl = new ReentrantReadWriteLock(true); private final Lock readLock = rwl.readLock(); private final Lock writeLock = rwl.writeLock(); @@ -314,10 +320,16 @@ public Resource assignContainer(FSSchedulerNode node) { return assigned; } - Comparator comparator = policy.getComparator(); + pendingForResourceApps.clear(); writeLock.lock(); try { - Collections.sort(runnableApps, comparator); + for (FSAppAttempt app : runnableApps) { + if (Resources.greaterThan(scheduler.getResourceCalculator(), + scheduler.getClusterResource(), + app.getAppAttemptResourceUsage().getPending(), Resources.none())) { + pendingForResourceApps.add(app); + } + } } finally { writeLock.unlock(); } @@ -326,7 +338,7 @@ public Resource assignContainer(FSSchedulerNode node) { // but we can accept it in practice since the probability is low. readLock.lock(); try { - for (FSAppAttempt sched : runnableApps) { + for (FSAppAttempt sched : pendingForResourceApps) { if (SchedulerAppUtils.isBlacklisted(sched, node, LOG)) { continue; }