Author: tgraves
Date: Fri Jan 11 21:20:38 2013
New Revision: 1432290
URL: http://svn.apache.org/viewvc?rev=1432290&view=rev
Log:
YARN-80. Add support for delaying rack-local containers in CapacityScheduler.
(acmurthy)
Modified:
hadoop/common/branches/branch-0.23/hadoop-yarn-project/CHANGES.txt
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerConfiguration.java
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/resources/capacity-scheduler.xml
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestLeafQueue.java
Modified: hadoop/common/branches/branch-0.23/hadoop-yarn-project/CHANGES.txt
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-yarn-project/CHANGES.txt?rev=1432290&r1=1432289&r2=1432290&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-yarn-project/CHANGES.txt
(original)
+++ hadoop/common/branches/branch-0.23/hadoop-yarn-project/CHANGES.txt Fri Jan
11 21:20:38 2013
@@ -86,6 +86,9 @@ Release 0.23.5 - UNRELEASED
YARN-216. Remove jquery theming support. (Robert Joseph Evans via jlowe)
+ YARN-80. Add support for delaying rack-local containers in
+ CapacityScheduler. (acmurthy)
+
OPTIMIZATIONS
BUG FIXES
Modified:
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerConfiguration.java
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerConfiguration.java?rev=1432290&r1=1432289&r2=1432290&view=diff
==============================================================================
---
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerConfiguration.java
(original)
+++
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerConfiguration.java
Fri Jan 11 21:20:38 2013
@@ -115,6 +115,13 @@ public class CapacitySchedulerConfigurat
@Private
public static final String ROOT = "root";
+ @Private
+ public static final String NODE_LOCALITY_DELAY =
+ PREFIX + "node-locality-delay";
+
+ @Private
+ public static final int DEFAULT_NODE_LOCALITY_DELAY = -1;
+
public CapacitySchedulerConfiguration() {
this(new Configuration());
}
@@ -290,4 +297,9 @@ public class CapacitySchedulerConfigurat
public boolean getEnableUserMetrics() {
return getBoolean(ENABLE_USER_METRICS, DEFAULT_ENABLE_USER_METRICS);
}
+
+ public int getNodeLocalityDelay() {
+ int delay = getInt(NODE_LOCALITY_DELAY, DEFAULT_NODE_LOCALITY_DELAY);
+ return (delay == DEFAULT_NODE_LOCALITY_DELAY) ? 0 : delay;
+ }
}
Modified:
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java?rev=1432290&r1=1432289&r2=1432290&view=diff
==============================================================================
---
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java
(original)
+++
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java
Fri Jan 11 21:20:38 2013
@@ -124,6 +124,8 @@ public class LeafQueue implements CSQueu
private final ActiveUsersManager activeUsersManager;
+ private final int nodeLocalityDelay;
+
public LeafQueue(CapacitySchedulerContext cs,
String queueName, CSQueue parent,
Comparator<SchedulerApp> applicationComparator, CSQueue old) {
@@ -188,6 +190,9 @@ public class LeafQueue implements CSQueu
Map<QueueACL, AccessControlList> acls =
cs.getConfiguration().getAcls(getQueuePath());
+ this.nodeLocalityDelay =
+ cs.getConfiguration().getNodeLocalityDelay();
+
setupQueueConfigs(
cs.getClusterResources(),
capacity, absoluteCapacity,
@@ -531,6 +536,11 @@ public class LeafQueue implements CSQueu
return Collections.singletonList(userAclInfo);
}
+ @Private
+ public int getNodeLocalityDelay() {
+ return nodeLocalityDelay;
+ }
+
public String toString() {
return queueName + ": " +
"capacity=" + capacity + ", " +
@@ -1096,7 +1106,7 @@ public class LeafQueue implements CSQueu
reservedContainer)) {
return assignContainer(clusterResource, node, application, priority,
request,
NodeType.RACK_LOCAL, reservedContainer);
- }
+ }
}
return Resources.none();
}
@@ -1113,7 +1123,6 @@ public class LeafQueue implements CSQueu
NodeType.OFF_SWITCH, reservedContainer);
}
}
-
return Resources.none();
}
@@ -1148,7 +1157,12 @@ public class LeafQueue implements CSQueu
// If we are here, we do need containers on this rack for RACK_LOCAL req
if (type == NodeType.RACK_LOCAL) {
- return true;
+ // 'Delay' rack-local just a little bit...
+ long missedOpportunities =
application.getSchedulingOpportunities(priority);
+ return (
+ Math.min(scheduler.getNumClusterNodes(), getNodeLocalityDelay()) <
+ missedOpportunities
+ );
}
// Check if we need containers on this host
Modified:
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/resources/capacity-scheduler.xml
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/resources/capacity-scheduler.xml?rev=1432290&r1=1432289&r2=1432290&view=diff
==============================================================================
---
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/resources/capacity-scheduler.xml
(original)
+++
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/resources/capacity-scheduler.xml
Fri Jan 11 21:20:38 2013
@@ -83,4 +83,15 @@
</description>
</property>
+ <property>
+ <name>yarn.scheduler.capacity.node-locality-delay</name>
+ <value>-1</value>
+ <description>
+ Number of missed scheduling opportunities after which the
CapacityScheduler
+ attempts to schedule rack-local containers.
+ Typically this should be set to number of racks in the cluster, this
+ feature is disabled by default, set to -1.
+ </description>
+ </property>
+
</configuration>
Modified:
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestLeafQueue.java
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestLeafQueue.java?rev=1432290&r1=1432289&r2=1432290&view=diff
==============================================================================
---
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestLeafQueue.java
(original)
+++
hadoop/common/branches/branch-0.23/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestLeafQueue.java
Fri Jan 11 21:20:38 2013
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertTru
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -1290,19 +1291,29 @@ public class TestLeafQueue {
TestUtils.createResourceRequest(rack_1, 1*GB, 1,
priority, recordFactory));
app_0_requests_0.add(
- TestUtils.createResourceRequest(RMNodeImpl.ANY, 1*GB, 1, // one extra
+ TestUtils.createResourceRequest(RMNodeImpl.ANY, 1*GB, 2, // one extra
priority, recordFactory));
app_0.updateResourceRequests(app_0_requests_0);
- assertEquals(1, app_0.getTotalRequiredResources(priority));
+ assertEquals(2, app_0.getTotalRequiredResources(priority));
String host_3 = "host_3"; // on rack_1
SchedulerNode node_3 = TestUtils.getMockNode(host_3, rack_1, 0, 8*GB);
+ // Rack-delay
+ doReturn(1).when(a).getNodeLocalityDelay();
+
+ // Shouldn't assign RACK_LOCAL yet
+ assignment = a.assignContainers(clusterResource, node_3);
+ assertEquals(1, app_0.getSchedulingOpportunities(priority));
+ assertEquals(2, app_0.getTotalRequiredResources(priority));
+ assertEquals(NodeType.NODE_LOCAL, assignment.getType()); //
None->NODE_LOCAL
+
+ // Should assign RACK_LOCAL now
assignment = a.assignContainers(clusterResource, node_3);
verify(app_0).allocate(eq(NodeType.RACK_LOCAL), eq(node_3),
any(Priority.class), any(ResourceRequest.class), any(Container.class));
assertEquals(0, app_0.getSchedulingOpportunities(priority)); // should
reset
- assertEquals(0, app_0.getTotalRequiredResources(priority));
+ assertEquals(1, app_0.getTotalRequiredResources(priority));
assertEquals(NodeType.RACK_LOCAL, assignment.getType());
}