diff -cNr a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairSchedulerConfiguration.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/FairSchedulerConfiguration.java *** a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairSchedulerConfiguration.java 2016-02-12 17:44:31.000000000 +0800 --- b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairSchedulerConfiguration.java 2016-04-21 16:29:25.147554435 +0800 *************** *** 18,25 **** package org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair; import java.io.File; - import java.util.ArrayList; - import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; --- 18,23 ---- *************** *** 122,127 **** --- 120,127 ---- /** Maximum number of containers to assign on each check-in. */ protected static final String MAX_ASSIGN = CONF_PREFIX + "max.assign"; protected static final int DEFAULT_MAX_ASSIGN = -1; + protected static final String SINGLE_MAX_ASSIGN = CONF_PREFIX + "single.max.assign"; + protected static final int DEFAULT_SINGLE_MAX_ASSIGN = -1; /** The update interval for calculating resources in FairScheduler .*/ public static final String UPDATE_INTERVAL_MS = *************** *** 205,210 **** --- 205,214 ---- public int getMaxAssign() { return getInt(MAX_ASSIGN, DEFAULT_MAX_ASSIGN); } + + public int getSingleAssign() { + return getInt(SINGLE_MAX_ASSIGN, DEFAULT_SINGLE_MAX_ASSIGN); + } public boolean getSizeBasedWeight() { return getBoolean(SIZE_BASED_WEIGHT, DEFAULT_SIZE_BASED_WEIGHT); diff -cNr a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.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/FairScheduler.java *** a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java 2016-02-12 17:44:31.000000000 +0800 --- b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java 2016-04-21 16:29:22.673216530 +0800 *************** *** 180,185 **** --- 180,186 ---- protected boolean assignMultiple; // Allocate multiple containers per // heartbeat protected int maxAssign; // Max containers to assign per heartbeat + protected int singleAssign; //Max containers to assign to application per heartbeart @VisibleForTesting final MaxRunningAppsEnforcer maxRunningEnforcer; *************** *** 1053,1061 **** if (reservedAppSchedulable == null) { // No reservation, schedule at queue which is farthest below fair share int assignedContainers = 0; while (node.getReservedContainer() == null) { boolean assignedContainer = false; ! if (!queueMgr.getRootQueue().assignContainer(node).equals( Resources.none())) { assignedContainers++; assignedContainer = true; --- 1054,1063 ---- if (reservedAppSchedulable == null) { // No reservation, schedule at queue which is farthest below fair share int assignedContainers = 0; + Map assigns = new HashMap(); while (node.getReservedContainer() == null) { boolean assignedContainer = false; ! if (!queueMgr.getRootQueue().assignContainer(node, assigns, singleAssign).equals( Resources.none())) { assignedContainers++; assignedContainer = true; *************** *** 1237,1242 **** --- 1239,1245 ---- this.conf.getPreemptionUtilizationThreshold(); assignMultiple = this.conf.getAssignMultiple(); maxAssign = this.conf.getMaxAssign(); + singleAssign = this.conf.getSingleAssign(); sizeBasedWeight = this.conf.getSizeBasedWeight(); preemptionInterval = this.conf.getPreemptionInterval(); waitTimeBeforeKill = this.conf.getWaitTimeBeforeKill(); diff -cNr a/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 b/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 *** a/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 2016-02-12 17:44:31.000000000 +0800 --- b/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 2016-04-21 16:29:30.594195430 +0800 *************** *** 765,772 **** } @Override ! public Resource assignContainer(FSSchedulerNode node) { ! return assignContainer(node, false); } /** --- 765,798 ---- } @Override ! public Resource assignContainer(FSSchedulerNode node, Map map, int singleMaxAssign) { ! if(map.get(this.getApplicationId().getId()) == null){ ! Resource assigned = assignContainer(node, false); ! if(!assigned.equals(Resources.none())){ ! map.put(this.getApplicationId().getId(), 1); ! } ! return assigned; ! } else { ! if(singleMaxAssign < 0){ ! Resource assigned = assignContainer(node, false); ! if(!assigned.equals(Resources.none())){ ! Integer nums = map.get(this.getApplicationId().getId()); ! map.put(this.getApplicationId().getId(), nums + 1); ! } ! return assigned; ! } else { ! if(map.get(this.getApplicationId().getId()) < singleMaxAssign){ ! Resource assigned = assignContainer(node, false); ! if(!assigned.equals(Resources.none())){ ! Integer nums = map.get(this.getApplicationId().getId()); ! map.put(this.getApplicationId().getId(), nums + 1); ! } ! return assigned; ! } else { ! return Resources.none(); ! } ! } ! } } /** diff -cNr 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 *** 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 2016-02-12 17:44:31.000000000 +0800 --- 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 2016-04-21 16:29:33.416911053 +0800 *************** *** 23,28 **** --- 23,29 ---- import java.util.Collections; import java.util.Comparator; import java.util.List; + import java.util.Map; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; *************** *** 299,305 **** } @Override ! public Resource assignContainer(FSSchedulerNode node) { Resource assigned = Resources.none(); if (LOG.isDebugEnabled()) { LOG.debug("Node " + node.getNodeName() + " offered to queue: " + --- 300,306 ---- } @Override ! public Resource assignContainer(FSSchedulerNode node, Map assigns, int singleMaxAssign) { Resource assigned = Resources.none(); if (LOG.isDebugEnabled()) { LOG.debug("Node " + node.getNodeName() + " offered to queue: " + *************** *** 324,330 **** continue; } ! assigned = sched.assignContainer(node); if (!assigned.equals(Resources.none())) { break; } --- 325,331 ---- continue; } ! assigned = sched.assignContainer(node, assigns, singleMaxAssign); if (!assigned.equals(Resources.none())) { break; } diff -cNr a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSParentQueue.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/FSParentQueue.java *** a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSParentQueue.java 2016-02-12 17:44:31.000000000 +0800 --- b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSParentQueue.java 2016-04-21 16:29:39.969287945 +0800 *************** *** 23,28 **** --- 23,29 ---- import java.util.Collections; import java.util.Comparator; import java.util.List; + import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; *************** *** 160,166 **** } @Override ! public Resource assignContainer(FSSchedulerNode node) { Resource assigned = Resources.none(); // If this queue is over its limit, reject --- 161,167 ---- } @Override ! public Resource assignContainer(FSSchedulerNode node, Map assigns, int singleMaxAssign) { Resource assigned = Resources.none(); // If this queue is over its limit, reject *************** *** 170,176 **** Collections.sort(childQueues, policy.getComparator()); for (FSQueue child : childQueues) { ! assigned = child.assignContainer(node); if (!Resources.equals(assigned, Resources.none())) { break; } --- 171,177 ---- Collections.sort(childQueues, policy.getComparator()); for (FSQueue child : childQueues) { ! assigned = child.assignContainer(node, assigns, singleMaxAssign); if (!Resources.equals(assigned, Resources.none())) { break; } diff -cNr a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/Schedulable.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/Schedulable.java *** a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/Schedulable.java 2016-02-12 17:44:31.000000000 +0800 --- b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/Schedulable.java 2016-04-21 16:30:20.792199204 +0800 *************** *** 18,23 **** --- 18,25 ---- package org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair; + import java.util.Map; + import org.apache.hadoop.classification.InterfaceAudience.Private; import org.apache.hadoop.classification.InterfaceStability.Unstable; import org.apache.hadoop.yarn.api.records.Priority; *************** *** 89,95 **** * Assign a container on this node if possible, and return the amount of * resources assigned. */ ! public Resource assignContainer(FSSchedulerNode node); /** * Preempt a container from this Schedulable if possible. --- 91,97 ---- * Assign a container on this node if possible, and return the amount of * resources assigned. */ ! public Resource assignContainer(FSSchedulerNode node, Map assigns, int singleMaxAssign); /** * Preempt a container from this Schedulable if possible. diff -cNr a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FakeSchedulable.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FakeSchedulable.java *** a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FakeSchedulable.java 2016-02-12 17:44:32.000000000 +0800 --- b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FakeSchedulable.java 2016-04-21 16:31:29.918197585 +0800 *************** *** 18,23 **** --- 18,25 ---- package org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair; + import java.util.Map; + import org.apache.hadoop.yarn.api.records.Priority; import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.server.resourcemanager.resource.ResourceWeights; *************** *** 81,87 **** } @Override ! public Resource assignContainer(FSSchedulerNode node) { return null; } --- 83,89 ---- } @Override ! public Resource assignContainer(FSSchedulerNode node, Map assigns, int singleMaxAssign) { return null; }