Skip to content

Commit 5bc9d5a

Browse files
committed
YARN-336. Fair scheduler FIFO scheduling within a queue only allows 1 app at a time. Contributed by Sandy Ryza.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1433526 13f79535-47bb-0310-9956-ffa450edef68
1 parent ab67daf commit 5bc9d5a

File tree

5 files changed

+52
-2
lines changed

5 files changed

+52
-2
lines changed

hadoop-yarn-project/CHANGES.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,9 @@ Release 2.0.3-alpha - Unreleased
192192

193193
YARN-335. Fair scheduler doesn't check whether rack needs containers
194194
before assigning to node. (Sandy Ryza via tomwhite)
195+
196+
YARN-336. Fair scheduler FIFO scheduling within a queue only allows 1
197+
app at a time. (Sandy Ryza via tomwhite)
195198

196199
Release 2.0.2-alpha - 2012-09-07
197200

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/AppSchedulable.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ private Resource assignContainer(FSSchedulerNode node,
275275
// The desired container won't fit here, so reserve
276276
reserve(application, priority, node, container, reserved);
277277

278-
return Resources.none();
278+
return FairScheduler.CONTAINER_RESERVED;
279279
}
280280
}
281281

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,10 @@ public Resource assignContainer(FSSchedulerNode node, boolean reserved) {
177177
Collections.sort(appScheds, comparator);
178178
for (AppSchedulable sched: appScheds) {
179179
if (sched.getRunnable()) {
180-
return sched.assignContainer(node, reserved);
180+
Resource assignedResource = sched.assignContainer(node, reserved);
181+
if (!assignedResource.equals(Resources.none())) {
182+
return assignedResource;
183+
}
181184
}
182185
}
183186

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ public class FairScheduler implements ResourceScheduler {
109109
private Clock clock;
110110

111111
private static final Log LOG = LogFactory.getLog(FairScheduler.class);
112+
113+
// Value that container assignment methods return when a container is
114+
// reserved
115+
public static final Resource CONTAINER_RESERVED = Resources.createResource(-1);
112116

113117
// How often fair shares are re-calculated (ms)
114118
protected long UPDATE_INTERVAL = 500;

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,4 +1317,44 @@ public void testMultipleNodesSingleRackRequest() throws Exception {
13171317
// should assign rack local
13181318
assertEquals(2, scheduler.applications.get(appId).getLiveContainers().size());
13191319
}
1320+
1321+
@Test
1322+
public void testFifoWithinQueue() throws Exception {
1323+
RMNode node1 = MockNodes.newNodeInfo(1, Resources.createResource(3072));
1324+
NodeAddedSchedulerEvent nodeEvent1 = new NodeAddedSchedulerEvent(node1);
1325+
scheduler.handle(nodeEvent1);
1326+
1327+
// Even if submitted at exact same time, apps will be deterministically
1328+
// ordered by name.
1329+
ApplicationAttemptId attId1 = createSchedulingRequest(1024, "queue1",
1330+
"user1", 2);
1331+
ApplicationAttemptId attId2 = createSchedulingRequest(1024, "queue1",
1332+
"user1", 2);
1333+
FSSchedulerApp app1 = scheduler.applications.get(attId1);
1334+
FSSchedulerApp app2 = scheduler.applications.get(attId2);
1335+
1336+
FSLeafQueue queue1 = scheduler.getQueueManager().getLeafQueue("queue1");
1337+
queue1.setSchedulingMode(SchedulingMode.FIFO);
1338+
1339+
scheduler.update();
1340+
1341+
// First two containers should go to app 1, third should go to app 2.
1342+
// Because tests set assignmultiple to false, each heartbeat assigns a single
1343+
// container.
1344+
1345+
NodeUpdateSchedulerEvent updateEvent = new NodeUpdateSchedulerEvent(node1,
1346+
new ArrayList<ContainerStatus>(), new ArrayList<ContainerStatus>());
1347+
1348+
scheduler.handle(updateEvent);
1349+
assertEquals(1, app1.getLiveContainers().size());
1350+
assertEquals(0, app2.getLiveContainers().size());
1351+
1352+
scheduler.handle(updateEvent);
1353+
assertEquals(2, app1.getLiveContainers().size());
1354+
assertEquals(0, app2.getLiveContainers().size());
1355+
1356+
scheduler.handle(updateEvent);
1357+
assertEquals(2, app1.getLiveContainers().size());
1358+
assertEquals(1, app2.getLiveContainers().size());
1359+
}
13201360
}

0 commit comments

Comments
 (0)