YARN-1141. Updating resource requests should be decoupled with updating blacklist (Zhijie Shen via bikas)

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1528632 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Bikas Saha 2013-10-02 21:31:47 +00:00
parent 3c7813bbad
commit 0a6e275ee3
10 changed files with 148 additions and 56 deletions

View File

@ -124,6 +124,9 @@ Release 2.1.2 - UNRELEASED
install with https enabled doesn't have broken link on NM UI. (Omkar Vinit install with https enabled doesn't have broken link on NM UI. (Omkar Vinit
Joshi via vinodkv) Joshi via vinodkv)
YARN-1141. Updating resource requests should be decoupled with updating
blacklist (Zhijie Shen via bikas)
Release 2.1.1-beta - 2013-09-23 Release 2.1.1-beta - 2013-09-23
INCOMPATIBLE CHANGES INCOMPATIBLE CHANGES

View File

@ -118,12 +118,9 @@ public class AppSchedulingInfo {
* by the application. * by the application.
* *
* @param requests resources to be acquired * @param requests resources to be acquired
* @param blacklistAdditions resources to be added to the blacklist
* @param blacklistRemovals resources to be removed from the blacklist
*/ */
synchronized public void updateResourceRequests( synchronized public void updateResourceRequests(
List<ResourceRequest> requests, List<ResourceRequest> requests) {
List<String> blacklistAdditions, List<String> blacklistRemovals) {
QueueMetrics metrics = queue.getMetrics(); QueueMetrics metrics = queue.getMetrics();
// Update resource requests // Update resource requests
@ -181,11 +178,16 @@ public class AppSchedulingInfo {
lastRequestContainers))); lastRequestContainers)));
} }
} }
}
// /**
// Update blacklist * The ApplicationMaster is updating the blacklist
// *
* @param blacklistAdditions resources to be added to the blacklist
* @param blacklistRemovals resources to be removed from the blacklist
*/
synchronized public void updateBlacklist(
List<String> blacklistAdditions, List<String> blacklistRemovals) {
// Add to blacklist // Add to blacklist
if (blacklistAdditions != null) { if (blacklistAdditions != null) {
blacklist.addAll(blacklistAdditions); blacklist.addAll(blacklistAdditions);

View File

@ -572,8 +572,7 @@ public class CapacityScheduler
application.showRequests(); application.showRequests();
// Update application requests // Update application requests
application.updateResourceRequests(ask, application.updateResourceRequests(ask);
blacklistAdditions, blacklistRemovals);
LOG.debug("allocate: post-update"); LOG.debug("allocate: post-update");
application.showRequests(); application.showRequests();
@ -585,6 +584,8 @@ public class CapacityScheduler
" #ask=" + ask.size()); " #ask=" + ask.size());
} }
application.updateBlacklist(blacklistAdditions, blacklistRemovals);
return application.getAllocation(getResourceCalculator(), return application.getAllocation(getResourceCalculator(),
clusterResource, getMinimumResourceCapability()); clusterResource, getMinimumResourceCapability());
} }

View File

@ -141,10 +141,16 @@ public class FiCaSchedulerApp extends SchedulerApplication {
} }
public synchronized void updateResourceRequests( public synchronized void updateResourceRequests(
List<ResourceRequest> requests, List<ResourceRequest> requests) {
if (!isStopped) {
this.appSchedulingInfo.updateResourceRequests(requests);
}
}
public synchronized void updateBlacklist(
List<String> blacklistAdditions, List<String> blacklistRemovals) { List<String> blacklistAdditions, List<String> blacklistRemovals) {
if (!isStopped) { if (!isStopped) {
this.appSchedulingInfo.updateResourceRequests(requests, this.appSchedulingInfo.updateBlacklist(
blacklistAdditions, blacklistRemovals); blacklistAdditions, blacklistRemovals);
} }
} }

View File

@ -138,7 +138,7 @@ public class FSSchedulerApp extends SchedulerApplication {
public synchronized void updateResourceRequests( public synchronized void updateResourceRequests(
List<ResourceRequest> requests) { List<ResourceRequest> requests) {
this.appSchedulingInfo.updateResourceRequests(requests, null, null); this.appSchedulingInfo.updateResourceRequests(requests);
} }
public Map<String, ResourceRequest> getResourceRequests(Priority priority) { public Map<String, ResourceRequest> getResourceRequests(Priority priority) {

View File

@ -304,7 +304,7 @@ public class FifoScheduler implements ResourceScheduler, Configurable {
application.showRequests(); application.showRequests();
// Update application requests // Update application requests
application.updateResourceRequests(ask, blacklistAdditions, blacklistRemovals); application.updateResourceRequests(ask);
LOG.debug("allocate: post-update" + LOG.debug("allocate: post-update" +
" applicationId=" + applicationAttemptId + " applicationId=" + applicationAttemptId +
@ -316,13 +316,16 @@ public class FifoScheduler implements ResourceScheduler, Configurable {
" #ask=" + ask.size()); " #ask=" + ask.size());
} }
application.updateBlacklist(blacklistAdditions, blacklistRemovals);
return new Allocation( return new Allocation(
application.pullNewlyAllocatedContainers(), application.pullNewlyAllocatedContainers(),
application.getHeadroom()); application.getHeadroom());
} }
} }
private FiCaSchedulerApp getApplication( @VisibleForTesting
FiCaSchedulerApp getApplication(
ApplicationAttemptId applicationAttemptId) { ApplicationAttemptId applicationAttemptId) {
return applications.get(applicationAttemptId); return applications.get(applicationAttemptId);
} }

View File

@ -513,7 +513,7 @@ public class TestApplicationLimits {
app_0_0_requests.add( app_0_0_requests.add(
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 2, TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 2,
true, priority_1, recordFactory)); true, priority_1, recordFactory));
app_0_0.updateResourceRequests(app_0_0_requests, null, null); app_0_0.updateResourceRequests(app_0_0_requests);
// Schedule to compute // Schedule to compute
queue.assignContainers(clusterResource, node_0); queue.assignContainers(clusterResource, node_0);
@ -532,7 +532,7 @@ public class TestApplicationLimits {
app_0_1_requests.add( app_0_1_requests.add(
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 2, TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 2,
true, priority_1, recordFactory)); true, priority_1, recordFactory));
app_0_1.updateResourceRequests(app_0_1_requests, null, null); app_0_1.updateResourceRequests(app_0_1_requests);
// Schedule to compute // Schedule to compute
queue.assignContainers(clusterResource, node_0); // Schedule to compute queue.assignContainers(clusterResource, node_0); // Schedule to compute
@ -551,7 +551,7 @@ public class TestApplicationLimits {
app_1_0_requests.add( app_1_0_requests.add(
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 2, TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 2,
true, priority_1, recordFactory)); true, priority_1, recordFactory));
app_1_0.updateResourceRequests(app_1_0_requests, null, null); app_1_0.updateResourceRequests(app_1_0_requests);
// Schedule to compute // Schedule to compute
queue.assignContainers(clusterResource, node_0); // Schedule to compute queue.assignContainers(clusterResource, node_0); // Schedule to compute

View File

@ -28,6 +28,7 @@ import static org.mockito.Mockito.when;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -41,6 +42,7 @@ import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.net.NetworkTopology; import org.apache.hadoop.net.NetworkTopology;
import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.ApplicationId;
import org.apache.hadoop.yarn.api.records.ContainerId;
import org.apache.hadoop.yarn.api.records.Priority; import org.apache.hadoop.yarn.api.records.Priority;
import org.apache.hadoop.yarn.api.records.QueueInfo; import org.apache.hadoop.yarn.api.records.QueueInfo;
import org.apache.hadoop.yarn.api.records.QueueUserACLInfo; import org.apache.hadoop.yarn.api.records.QueueUserACLInfo;
@ -52,6 +54,7 @@ import org.apache.hadoop.yarn.exceptions.YarnException;
import org.apache.hadoop.yarn.exceptions.YarnRuntimeException; import org.apache.hadoop.yarn.exceptions.YarnRuntimeException;
import org.apache.hadoop.yarn.server.resourcemanager.Application; import org.apache.hadoop.yarn.server.resourcemanager.Application;
import org.apache.hadoop.yarn.server.resourcemanager.MockNodes; import org.apache.hadoop.yarn.server.resourcemanager.MockNodes;
import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
import org.apache.hadoop.yarn.server.resourcemanager.RMContext; import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
import org.apache.hadoop.yarn.server.resourcemanager.RMContextImpl; import org.apache.hadoop.yarn.server.resourcemanager.RMContextImpl;
import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager; import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
@ -62,11 +65,14 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.Queue;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerApplication; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerApplication;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerApp; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerApp;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.AppAddedSchedulerEvent;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.NodeAddedSchedulerEvent; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.NodeAddedSchedulerEvent;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.NodeRemovedSchedulerEvent; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.NodeRemovedSchedulerEvent;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.SchedulerEvent;
import org.apache.hadoop.yarn.server.resourcemanager.security.ClientToAMTokenSecretManagerInRM; import org.apache.hadoop.yarn.server.resourcemanager.security.ClientToAMTokenSecretManagerInRM;
import org.apache.hadoop.yarn.server.resourcemanager.security.NMTokenSecretManagerInRM; import org.apache.hadoop.yarn.server.resourcemanager.security.NMTokenSecretManagerInRM;
import org.apache.hadoop.yarn.server.resourcemanager.security.RMContainerTokenSecretManager; import org.apache.hadoop.yarn.server.resourcemanager.security.RMContainerTokenSecretManager;
import org.apache.hadoop.yarn.server.utils.BuilderUtils;
import org.apache.hadoop.yarn.util.resource.Resources; import org.apache.hadoop.yarn.util.resource.Resources;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
@ -513,6 +519,39 @@ public class TestCapacityScheduler {
return result; return result;
} }
@SuppressWarnings("resource")
@Test
public void testBlackListNodes() throws Exception {
Configuration conf = new Configuration();
conf.setClass(YarnConfiguration.RM_SCHEDULER, CapacityScheduler.class,
ResourceScheduler.class);
MockRM rm = new MockRM(conf);
rm.start();
CapacityScheduler cs = (CapacityScheduler) rm.getResourceScheduler();
String host = "127.0.0.1";
RMNode node =
MockNodes.newNodeInfo(0, MockNodes.newResource(4 * GB), 1, host);
cs.handle(new NodeAddedSchedulerEvent(node));
ApplicationId appId = BuilderUtils.newApplicationId(100, 1);
ApplicationAttemptId appAttemptId = BuilderUtils.newApplicationAttemptId(
appId, 1);
SchedulerEvent event = new AppAddedSchedulerEvent(appAttemptId, "default",
"user");
cs.handle(event);
// Verify the blacklist can be updated independent of requesting containers
cs.allocate(appAttemptId, Collections.<ResourceRequest>emptyList(),
Collections.<ContainerId>emptyList(),
Collections.singletonList(host), null);
Assert.assertTrue(cs.getApplication(appAttemptId).isBlacklisted(host));
cs.allocate(appAttemptId, Collections.<ResourceRequest>emptyList(),
Collections.<ContainerId>emptyList(), null,
Collections.singletonList(host));
Assert.assertFalse(cs.getApplication(appAttemptId).isBlacklisted(host));
rm.stop();
}
@Test (timeout = 5000) @Test (timeout = 5000)
public void testApplicationComparator() public void testApplicationComparator()

View File

@ -294,7 +294,7 @@ public class TestLeafQueue {
Priority priority = TestUtils.createMockPriority(1); Priority priority = TestUtils.createMockPriority(1);
app_0.updateResourceRequests(Collections.singletonList( app_0.updateResourceRequests(Collections.singletonList(
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 3, true, TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 3, true,
priority, recordFactory)), null, null); priority, recordFactory)));
// Start testing... // Start testing...
@ -416,11 +416,11 @@ public class TestLeafQueue {
Priority priority = TestUtils.createMockPriority(1); Priority priority = TestUtils.createMockPriority(1);
app_0.updateResourceRequests(Collections.singletonList( app_0.updateResourceRequests(Collections.singletonList(
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 3, true, TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 3, true,
priority, recordFactory)), null, null); priority, recordFactory)));
app_1.updateResourceRequests(Collections.singletonList( app_1.updateResourceRequests(Collections.singletonList(
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 2, true, TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 2, true,
priority, recordFactory)), null, null); priority, recordFactory)));
// Start testing... // Start testing...
@ -549,11 +549,11 @@ public class TestLeafQueue {
Priority priority = TestUtils.createMockPriority(1); Priority priority = TestUtils.createMockPriority(1);
app_0.updateResourceRequests(Collections.singletonList( app_0.updateResourceRequests(Collections.singletonList(
TestUtils.createResourceRequest(ResourceRequest.ANY, 2*GB, 1, true, TestUtils.createResourceRequest(ResourceRequest.ANY, 2*GB, 1, true,
priority, recordFactory)), null, null); priority, recordFactory)));
app_1.updateResourceRequests(Collections.singletonList( app_1.updateResourceRequests(Collections.singletonList(
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 2, true, TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 2, true,
priority, recordFactory)), null, null); priority, recordFactory)));
/** /**
* Start testing... * Start testing...
@ -642,11 +642,11 @@ public class TestLeafQueue {
Priority priority = TestUtils.createMockPriority(1); Priority priority = TestUtils.createMockPriority(1);
app_0.updateResourceRequests(Collections.singletonList( app_0.updateResourceRequests(Collections.singletonList(
TestUtils.createResourceRequest(ResourceRequest.ANY, 2*GB, 1, true, TestUtils.createResourceRequest(ResourceRequest.ANY, 2*GB, 1, true,
priority, recordFactory)), null, null); priority, recordFactory)));
app_1.updateResourceRequests(Collections.singletonList( app_1.updateResourceRequests(Collections.singletonList(
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 2, true, TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 2, true,
priority, recordFactory)), null, null); priority, recordFactory)));
/** /**
* Start testing... * Start testing...
@ -681,7 +681,7 @@ public class TestLeafQueue {
a.setMaxCapacity(.1f); a.setMaxCapacity(.1f);
app_2.updateResourceRequests(Collections.singletonList( app_2.updateResourceRequests(Collections.singletonList(
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 1, true, TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 1, true,
priority, recordFactory)), null, null); priority, recordFactory)));
assertEquals(2, a.getActiveUsersManager().getNumActiveUsers()); assertEquals(2, a.getActiveUsersManager().getNumActiveUsers());
// No more to user_0 since he is already over user-limit // No more to user_0 since he is already over user-limit
@ -698,7 +698,7 @@ public class TestLeafQueue {
LOG.info("here"); LOG.info("here");
app_1.updateResourceRequests(Collections.singletonList( // unset app_1.updateResourceRequests(Collections.singletonList( // unset
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 0, true, TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 0, true,
priority, recordFactory)), null, null); priority, recordFactory)));
assertEquals(1, a.getActiveUsersManager().getNumActiveUsers()); assertEquals(1, a.getActiveUsersManager().getNumActiveUsers());
a.assignContainers(clusterResource, node_1); a.assignContainers(clusterResource, node_1);
assertEquals(1*GB, app_2.getHeadroom().getMemory()); // hit queue max-cap assertEquals(1*GB, app_2.getHeadroom().getMemory()); // hit queue max-cap
@ -759,11 +759,11 @@ public class TestLeafQueue {
Priority priority = TestUtils.createMockPriority(1); Priority priority = TestUtils.createMockPriority(1);
app_0.updateResourceRequests(Collections.singletonList( app_0.updateResourceRequests(Collections.singletonList(
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 10, true, TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 10, true,
priority, recordFactory)), null, null); priority, recordFactory)));
app_1.updateResourceRequests(Collections.singletonList( app_1.updateResourceRequests(Collections.singletonList(
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 10, true, TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 10, true,
priority, recordFactory)), null, null); priority, recordFactory)));
/** /**
* Start testing... * Start testing...
@ -793,11 +793,11 @@ public class TestLeafQueue {
app_2.updateResourceRequests(Collections.singletonList( app_2.updateResourceRequests(Collections.singletonList(
TestUtils.createResourceRequest(ResourceRequest.ANY, 3*GB, 1, true, TestUtils.createResourceRequest(ResourceRequest.ANY, 3*GB, 1, true,
priority, recordFactory)), null, null); priority, recordFactory)));
app_3.updateResourceRequests(Collections.singletonList( app_3.updateResourceRequests(Collections.singletonList(
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 2, true, TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 2, true,
priority, recordFactory)), null, null); priority, recordFactory)));
// Now allocations should goto app_2 since // Now allocations should goto app_2 since
// user_0 is at limit inspite of high user-limit-factor // user_0 is at limit inspite of high user-limit-factor
@ -921,11 +921,11 @@ public class TestLeafQueue {
Priority priority = TestUtils.createMockPriority(1); Priority priority = TestUtils.createMockPriority(1);
app_0.updateResourceRequests(Collections.singletonList( app_0.updateResourceRequests(Collections.singletonList(
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 2, true, TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 2, true,
priority, recordFactory)), null, null); priority, recordFactory)));
app_1.updateResourceRequests(Collections.singletonList( app_1.updateResourceRequests(Collections.singletonList(
TestUtils.createResourceRequest(ResourceRequest.ANY, 4*GB, 1, true, TestUtils.createResourceRequest(ResourceRequest.ANY, 4*GB, 1, true,
priority, recordFactory)), null, null); priority, recordFactory)));
// Start testing... // Start testing...
@ -1025,7 +1025,7 @@ public class TestLeafQueue {
Priority priority = TestUtils.createMockPriority(1); Priority priority = TestUtils.createMockPriority(1);
app_0.updateResourceRequests(Collections.singletonList( app_0.updateResourceRequests(Collections.singletonList(
TestUtils.createResourceRequest(ResourceRequest.ANY, 2*GB, 1, true, TestUtils.createResourceRequest(ResourceRequest.ANY, 2*GB, 1, true,
priority, recordFactory)), null, null); priority, recordFactory)));
// Setup app_1 to request a 4GB container on host_0 and // Setup app_1 to request a 4GB container on host_0 and
// another 4GB container anywhere. // another 4GB container anywhere.
@ -1037,7 +1037,7 @@ public class TestLeafQueue {
true, priority, recordFactory)); true, priority, recordFactory));
appRequests_1.add(TestUtils.createResourceRequest(ResourceRequest.ANY, 4*GB, 2, appRequests_1.add(TestUtils.createResourceRequest(ResourceRequest.ANY, 4*GB, 2,
true, priority, recordFactory)); true, priority, recordFactory));
app_1.updateResourceRequests(appRequests_1, null, null); app_1.updateResourceRequests(appRequests_1);
// Start testing... // Start testing...
@ -1132,11 +1132,11 @@ public class TestLeafQueue {
Priority priority = TestUtils.createMockPriority(1); Priority priority = TestUtils.createMockPriority(1);
app_0.updateResourceRequests(Collections.singletonList( app_0.updateResourceRequests(Collections.singletonList(
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 2, true, TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 2, true,
priority, recordFactory)), null, null); priority, recordFactory)));
app_1.updateResourceRequests(Collections.singletonList( app_1.updateResourceRequests(Collections.singletonList(
TestUtils.createResourceRequest(ResourceRequest.ANY, 4*GB, 1, true, TestUtils.createResourceRequest(ResourceRequest.ANY, 4*GB, 1, true,
priority, recordFactory)), null, null); priority, recordFactory)));
// Start testing... // Start testing...
@ -1261,7 +1261,7 @@ public class TestLeafQueue {
app_0_requests_0.add( app_0_requests_0.add(
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 3, // one extra TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 3, // one extra
true, priority, recordFactory)); true, priority, recordFactory));
app_0.updateResourceRequests(app_0_requests_0, null, null); app_0.updateResourceRequests(app_0_requests_0);
// Start testing... // Start testing...
CSAssignment assignment = null; CSAssignment assignment = null;
@ -1326,7 +1326,7 @@ public class TestLeafQueue {
app_0_requests_0.add( app_0_requests_0.add(
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 2, // one extra TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 2, // one extra
true, priority, recordFactory)); true, priority, recordFactory));
app_0.updateResourceRequests(app_0_requests_0, null, null); app_0.updateResourceRequests(app_0_requests_0);
assertEquals(2, app_0.getTotalRequiredResources(priority)); assertEquals(2, app_0.getTotalRequiredResources(priority));
String host_3 = "127.0.0.4"; // on rack_1 String host_3 = "127.0.0.4"; // on rack_1
@ -1417,7 +1417,7 @@ public class TestLeafQueue {
TestUtils.createResourceRequest(ResourceRequest.ANY, 2*GB, 1, TestUtils.createResourceRequest(ResourceRequest.ANY, 2*GB, 1,
true, priority_2, recordFactory)); true, priority_2, recordFactory));
app_0.updateResourceRequests(app_0_requests_0, null, null); app_0.updateResourceRequests(app_0_requests_0);
// Start testing... // Start testing...
@ -1532,7 +1532,7 @@ public class TestLeafQueue {
app_0_requests_0.add( app_0_requests_0.add(
TestUtils.createResourceRequest(rack_1, 1*GB, 1, TestUtils.createResourceRequest(rack_1, 1*GB, 1,
true, priority, recordFactory)); true, priority, recordFactory));
app_0.updateResourceRequests(app_0_requests_0, null, null); app_0.updateResourceRequests(app_0_requests_0);
// Start testing... // Start testing...
@ -1541,7 +1541,7 @@ public class TestLeafQueue {
app_0_requests_0.add( app_0_requests_0.add(
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 1, // only one TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 1, // only one
true, priority, recordFactory)); true, priority, recordFactory));
app_0.updateResourceRequests(app_0_requests_0, null, null); app_0.updateResourceRequests(app_0_requests_0);
// NODE_LOCAL - node_0_1 // NODE_LOCAL - node_0_1
a.assignContainers(clusterResource, node_0_0); a.assignContainers(clusterResource, node_0_0);
@ -1564,7 +1564,7 @@ public class TestLeafQueue {
app_0_requests_0.add( app_0_requests_0.add(
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 1, // only one TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 1, // only one
true, priority, recordFactory)); true, priority, recordFactory));
app_0.updateResourceRequests(app_0_requests_0, null, null); app_0.updateResourceRequests(app_0_requests_0);
// No allocation on node_0_1 even though it's node/rack local since // No allocation on node_0_1 even though it's node/rack local since
// required(rack_1) == 0 // required(rack_1) == 0
@ -1809,8 +1809,8 @@ public class TestLeafQueue {
app_0_requests_0.add( app_0_requests_0.add(
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 1, // only one TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 1, // only one
false, priority, recordFactory)); false, priority, recordFactory));
app_0.updateResourceRequests(app_0_requests_0, app_0.updateResourceRequests(app_0_requests_0);
Collections.singletonList(host_0_0), null); app_0.updateBlacklist(Collections.singletonList(host_0_0), null);
app_0_requests_0.clear(); app_0_requests_0.clear();
// //
@ -1850,8 +1850,8 @@ public class TestLeafQueue {
app_0_requests_0.add( app_0_requests_0.add(
TestUtils.createResourceRequest(rack_1, 1*GB, 1, TestUtils.createResourceRequest(rack_1, 1*GB, 1,
true, priority, recordFactory)); true, priority, recordFactory));
app_0.updateResourceRequests(app_0_requests_0, app_0.updateResourceRequests(app_0_requests_0);
Collections.singletonList(host_1_1), null); app_0.updateBlacklist(Collections.singletonList(host_1_1), null);
app_0_requests_0.clear(); app_0_requests_0.clear();
// resourceName: <priority, memory, #containers, relaxLocality> // resourceName: <priority, memory, #containers, relaxLocality>
@ -1877,7 +1877,8 @@ public class TestLeafQueue {
assertEquals(0, app_0.getSchedulingOpportunities(priority)); // should be 0 assertEquals(0, app_0.getSchedulingOpportunities(priority)); // should be 0
// Now, remove node_1_1 from blacklist, but add rack_1 to blacklist // Now, remove node_1_1 from blacklist, but add rack_1 to blacklist
app_0.updateResourceRequests(app_0_requests_0, app_0.updateResourceRequests(app_0_requests_0);
app_0.updateBlacklist(
Collections.singletonList(rack_1), Collections.singletonList(host_1_1)); Collections.singletonList(rack_1), Collections.singletonList(host_1_1));
app_0_requests_0.clear(); app_0_requests_0.clear();
@ -1904,8 +1905,8 @@ public class TestLeafQueue {
assertEquals(0, app_0.getSchedulingOpportunities(priority)); // should be 0 assertEquals(0, app_0.getSchedulingOpportunities(priority)); // should be 0
// Now remove rack_1 from blacklist // Now remove rack_1 from blacklist
app_0.updateResourceRequests(app_0_requests_0, app_0.updateResourceRequests(app_0_requests_0);
null, Collections.singletonList(rack_1)); app_0.updateBlacklist(null, Collections.singletonList(rack_1));
app_0_requests_0.clear(); app_0_requests_0.clear();
// resourceName: <priority, memory, #containers, relaxLocality> // resourceName: <priority, memory, #containers, relaxLocality>
@ -1937,7 +1938,7 @@ public class TestLeafQueue {
app_0_requests_0.add( app_0_requests_0.add(
TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 1, // only one TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 1, // only one
false, priority, recordFactory)); false, priority, recordFactory));
app_0.updateResourceRequests(app_0_requests_0, null, null); app_0.updateResourceRequests(app_0_requests_0);
app_0_requests_0.clear(); app_0_requests_0.clear();
// resourceName: <priority, memory, #containers, relaxLocality> // resourceName: <priority, memory, #containers, relaxLocality>

View File

@ -20,6 +20,7 @@ package org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import junit.framework.Assert; import junit.framework.Assert;
@ -43,6 +44,7 @@ import org.apache.hadoop.yarn.factories.RecordFactory;
import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider; import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
import org.apache.hadoop.yarn.server.resourcemanager.Application; import org.apache.hadoop.yarn.server.resourcemanager.Application;
import org.apache.hadoop.yarn.server.resourcemanager.MockNodes; import org.apache.hadoop.yarn.server.resourcemanager.MockNodes;
import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
import org.apache.hadoop.yarn.server.resourcemanager.RMContext; import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
import org.apache.hadoop.yarn.server.resourcemanager.RMContextImpl; import org.apache.hadoop.yarn.server.resourcemanager.RMContextImpl;
import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager; import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
@ -67,6 +69,7 @@ import org.junit.Test;
public class TestFifoScheduler { public class TestFifoScheduler {
private static final Log LOG = LogFactory.getLog(TestFifoScheduler.class); private static final Log LOG = LogFactory.getLog(TestFifoScheduler.class);
private final int GB = 1024;
private ResourceManager resourceManager = null; private ResourceManager resourceManager = null;
@ -424,6 +427,40 @@ public class TestFifoScheduler {
fs.applications, FiCaSchedulerApp.class); fs.applications, FiCaSchedulerApp.class);
} }
@SuppressWarnings("resource")
@Test
public void testBlackListNodes() throws Exception {
Configuration conf = new Configuration();
conf.setClass(YarnConfiguration.RM_SCHEDULER, FifoScheduler.class,
ResourceScheduler.class);
MockRM rm = new MockRM(conf);
rm.start();
FifoScheduler fs = (FifoScheduler) rm.getResourceScheduler();
String host = "127.0.0.1";
RMNode node =
MockNodes.newNodeInfo(0, MockNodes.newResource(4 * GB), 1, host);
fs.handle(new NodeAddedSchedulerEvent(node));
ApplicationId appId = BuilderUtils.newApplicationId(100, 1);
ApplicationAttemptId appAttemptId = BuilderUtils.newApplicationAttemptId(
appId, 1);
SchedulerEvent event = new AppAddedSchedulerEvent(appAttemptId, "default",
"user");
fs.handle(event);
// Verify the blacklist can be updated independent of requesting containers
fs.allocate(appAttemptId, Collections.<ResourceRequest>emptyList(),
Collections.<ContainerId>emptyList(),
Collections.singletonList(host), null);
Assert.assertTrue(fs.getApplication(appAttemptId).isBlacklisted(host));
fs.allocate(appAttemptId, Collections.<ResourceRequest>emptyList(),
Collections.<ContainerId>emptyList(), null,
Collections.singletonList(host));
Assert.assertFalse(fs.getApplication(appAttemptId).isBlacklisted(host));
rm.stop();
}
private void checkApplicationResourceUsage(int expected, private void checkApplicationResourceUsage(int expected,
Application application) { Application application) {
Assert.assertEquals(expected, application.getUsedResources().getMemory()); Assert.assertEquals(expected, application.getUsedResources().getMemory());