http://git-wip-us.apache.org/repos/asf/hadoop/blob/821b0de4/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoCreatedQueueBase.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoCreatedQueueBase.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoCreatedQueueBase.java index 6c6ac20..addec66 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoCreatedQueueBase.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoCreatedQueueBase.java @@ -29,6 +29,7 @@ import org.apache.hadoop.security.TestGroupsCaching; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.NodeId; +import org.apache.hadoop.yarn.api.records.NodeLabel; import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.event.AsyncDispatcher; @@ -65,6 +66,8 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair .SimpleGroupsMapping; import org.apache.hadoop.yarn.server.utils.BuilderUtils; +import org.apache.hadoop.yarn.util.Records; +import org.apache.hadoop.yarn.util.YarnVersionInfo; import org.apache.hadoop.yarn.util.resource.Resources; import org.junit.After; import org.junit.Assert; @@ -89,6 +92,8 @@ import static org.apache.hadoop.yarn.server.resourcemanager.scheduler .capacity.CapacitySchedulerConfiguration.DOT; import static org.apache.hadoop.yarn.server.resourcemanager.scheduler .capacity.CapacitySchedulerConfiguration.FAIR_APP_ORDERING_POLICY; +import static org.apache.hadoop.yarn.server.resourcemanager.scheduler + .capacity.CapacitySchedulerConfiguration.ROOT; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -99,7 +104,7 @@ public class TestCapacitySchedulerAutoCreatedQueueBase { private static final Log LOG = LogFactory.getLog( TestCapacitySchedulerAutoCreatedQueueBase.class); public static final int GB = 1024; - public final static ContainerUpdates NULL_UPDATE_REQUESTS = + public static final ContainerUpdates NULL_UPDATE_REQUESTS = new ContainerUpdates(); public static final String A = CapacitySchedulerConfiguration.ROOT + ".a"; @@ -112,9 +117,6 @@ public class TestCapacitySchedulerAutoCreatedQueueBase { public static final String B1 = B + ".b1"; public static final String B2 = B + ".b2"; public static final String B3 = B + ".b3"; - public static final String C1 = C + ".c1"; - public static final String C2 = C + ".c2"; - public static final String C3 = C + ".c3"; public static final float A_CAPACITY = 20f; public static final float B_CAPACITY = 40f; public static final float C_CAPACITY = 20f; @@ -124,8 +126,6 @@ public class TestCapacitySchedulerAutoCreatedQueueBase { public static final float B1_CAPACITY = 60f; public static final float B2_CAPACITY = 20f; public static final float B3_CAPACITY = 20f; - public static final float C1_CAPACITY = 20f; - public static final float C2_CAPACITY = 20f; public static final int NODE_MEMORY = 16; @@ -147,12 +147,14 @@ public class TestCapacitySchedulerAutoCreatedQueueBase { public static final String NODEL_LABEL_GPU = "GPU"; public static final String NODEL_LABEL_SSD = "SSD"; + public static final float NODE_LABEL_GPU_TEMPLATE_CAPACITY = 30.0f; + public static final float NODEL_LABEL_SSD_TEMPLATE_CAPACITY = 40.0f; + protected MockRM mockRM = null; protected MockNM nm1 = null; protected MockNM nm2 = null; protected MockNM nm3 = null; protected CapacityScheduler cs; - private final TestCapacityScheduler tcs = new TestCapacityScheduler(); protected SpyDispatcher dispatcher; private static EventHandler<Event> rmAppEventEventHandler; @@ -215,15 +217,29 @@ public class TestCapacitySchedulerAutoCreatedQueueBase { } protected void setupNodes(MockRM newMockRM) throws Exception { + NodeLabel ssdLabel = Records.newRecord(NodeLabel.class); + ssdLabel.setName(NODEL_LABEL_SSD); + ssdLabel.setExclusivity(true); + nm1 = // label = SSD - new MockNM("h1:1234", NODE_MEMORY * GB, NODE1_VCORES, newMockRM - .getResourceTrackerService()); + new MockNM("h1:1234", + Resource.newInstance(NODE_MEMORY * GB, NODE1_VCORES), + newMockRM.getResourceTrackerService(), + YarnVersionInfo.getVersion(), + new HashSet<NodeLabel>() {{ add(ssdLabel); }}); + nm1.registerNode(); - nm2 = // label = GPU - new MockNM("h2:1234", NODE_MEMORY * GB, NODE2_VCORES, newMockRM - .getResourceTrackerService - ()); + NodeLabel gpuLabel = Records.newRecord(NodeLabel.class); + ssdLabel.setName(NODEL_LABEL_GPU); + ssdLabel.setExclusivity(true); + + //Label = GPU + nm2 = new MockNM("h2:1234", + Resource.newInstance(NODE_MEMORY * GB, NODE2_VCORES), + newMockRM.getResourceTrackerService(), + YarnVersionInfo.getVersion(), + new HashSet<NodeLabel>() {{ add(gpuLabel); }}); nm2.registerNode(); nm3 = // label = "" @@ -295,19 +311,23 @@ public class TestCapacitySchedulerAutoCreatedQueueBase { /** * @param conf, to be modified - * @return, CS configuration which has C as an auto creation enabled parent - * queue - * <p> - * root / \ \ \ a b c d / \ / | \ a1 a2 b1 - * b2 b3 + * @return, CS configuration which has C + * as an auto creation enabled parent queue + * <p> + * root + * / \ \ \ + * a b c d + * / \ / | \ + * a1 a2 b1 b2 b3 */ + public static CapacitySchedulerConfiguration setupQueueConfiguration( CapacitySchedulerConfiguration conf) { //setup new queues with one of them auto enabled // Define top-level queues // Set childQueue for root - conf.setQueues(CapacitySchedulerConfiguration.ROOT, + conf.setQueues(ROOT, new String[] { "a", "b", "c", "d" }); conf.setCapacity(A, A_CAPACITY); @@ -339,6 +359,19 @@ public class TestCapacitySchedulerAutoCreatedQueueBase { conf.setAutoCreatedLeafQueueConfigUserLimit(C, 100); conf.setAutoCreatedLeafQueueConfigUserLimitFactor(C, 3.0f); + conf.setAutoCreatedLeafQueueTemplateCapacityByLabel(C, NODEL_LABEL_GPU, + NODE_LABEL_GPU_TEMPLATE_CAPACITY); + conf.setAutoCreatedLeafQueueTemplateMaxCapacity(C, NODEL_LABEL_GPU, 100.0f); + conf.setAutoCreatedLeafQueueTemplateCapacityByLabel(C, NODEL_LABEL_SSD, + NODEL_LABEL_SSD_TEMPLATE_CAPACITY); + conf.setAutoCreatedLeafQueueTemplateMaxCapacity(C, NODEL_LABEL_SSD, + 100.0f); + + conf.setDefaultNodeLabelExpression(C, NODEL_LABEL_GPU); + conf.setAutoCreatedLeafQueueConfigDefaultNodeLabelExpression + (C, NODEL_LABEL_SSD); + + LOG.info("Setup " + C + " as an auto leaf creation enabled parent queue"); conf.setUserLimitFactor(D, 1.0f); @@ -363,8 +396,13 @@ public class TestCapacitySchedulerAutoCreatedQueueBase { accessibleNodeLabelsOnC.add(NO_LABEL); conf.setAccessibleNodeLabels(C, accessibleNodeLabelsOnC); - conf.setCapacityByLabel(C, NODEL_LABEL_GPU, 50); - conf.setCapacityByLabel(C, NODEL_LABEL_SSD, 50); + conf.setAccessibleNodeLabels(ROOT, accessibleNodeLabelsOnC); + conf.setCapacityByLabel(ROOT, NODEL_LABEL_GPU, 100f); + conf.setCapacityByLabel(ROOT, NODEL_LABEL_SSD, 100f); + + conf.setAccessibleNodeLabels(C, accessibleNodeLabelsOnC); + conf.setCapacityByLabel(C, NODEL_LABEL_GPU, 100f); + conf.setCapacityByLabel(C, NODEL_LABEL_SSD, 100f); LOG.info("Setup " + D + " as an auto leaf creation enabled parent queue"); @@ -541,19 +579,21 @@ public class TestCapacitySchedulerAutoCreatedQueueBase { autoCreatedLeafQueue.getMaxApplicationsPerUser()); } - protected void validateInitialQueueEntitlement(CSQueue parentQueue, - String leafQueueName, float expectedTotalChildQueueAbsCapacity, + protected void validateInitialQueueEntitlement(CSQueue parentQueue, String + leafQueueName, Map<String, Float> + expectedTotalChildQueueAbsCapacityByLabel, Set<String> nodeLabels) - throws SchedulerDynamicEditException { + throws SchedulerDynamicEditException, InterruptedException { validateInitialQueueEntitlement(cs, parentQueue, leafQueueName, - expectedTotalChildQueueAbsCapacity, nodeLabels); + expectedTotalChildQueueAbsCapacityByLabel, nodeLabels); } protected void validateInitialQueueEntitlement( CapacityScheduler capacityScheduler, CSQueue parentQueue, - String leafQueueName, float expectedTotalChildQueueAbsCapacity, + String leafQueueName, + Map<String, Float> expectedTotalChildQueueAbsCapacityByLabel, Set<String> nodeLabels) - throws SchedulerDynamicEditException { + throws SchedulerDynamicEditException, InterruptedException { ManagedParentQueue autoCreateEnabledParentQueue = (ManagedParentQueue) parentQueue; @@ -561,11 +601,7 @@ public class TestCapacitySchedulerAutoCreatedQueueBase { (GuaranteedOrZeroCapacityOverTimePolicy) autoCreateEnabledParentQueue .getAutoCreatedQueueManagementPolicy(); - assertEquals(expectedTotalChildQueueAbsCapacity, - policy.getAbsoluteActivatedChildQueueCapacity(), EPSILON); - - AutoCreatedLeafQueue leafQueue = - (AutoCreatedLeafQueue) capacityScheduler.getQueue(leafQueueName); + AutoCreatedLeafQueue leafQueue = (AutoCreatedLeafQueue) capacityScheduler.getQueue(leafQueueName); Map<String, QueueEntitlement> expectedEntitlements = new HashMap<>(); QueueCapacities cap = autoCreateEnabledParentQueue.getLeafQueueTemplate() @@ -573,6 +609,10 @@ public class TestCapacitySchedulerAutoCreatedQueueBase { for (String label : nodeLabels) { validateCapacitiesByLabel(autoCreateEnabledParentQueue, leafQueue, label); + assertEquals(true, policy.isActive(leafQueue, label)); + + assertEquals(expectedTotalChildQueueAbsCapacityByLabel.get(label), + policy.getAbsoluteActivatedChildQueueCapacity(label), EPSILON); QueueEntitlement expectedEntitlement = new QueueEntitlement( cap.getCapacity(label), cap.getMaximumCapacity(label)); @@ -581,21 +621,19 @@ public class TestCapacitySchedulerAutoCreatedQueueBase { validateEffectiveMinResource(leafQueue, label, expectedEntitlements); } - - assertEquals(true, policy.isActive(leafQueue)); } - protected void validateCapacitiesByLabel( - ManagedParentQueue autoCreateEnabledParentQueue, - AutoCreatedLeafQueue leafQueue, String label) { - assertEquals( - autoCreateEnabledParentQueue.getLeafQueueTemplate().getQueueCapacities() - .getCapacity(), leafQueue.getQueueCapacities().getCapacity(label), - EPSILON); - assertEquals( - autoCreateEnabledParentQueue.getLeafQueueTemplate().getQueueCapacities() - .getMaximumCapacity(), - leafQueue.getQueueCapacities().getMaximumCapacity(label), EPSILON); + protected void validateCapacitiesByLabel(ManagedParentQueue + autoCreateEnabledParentQueue, AutoCreatedLeafQueue leafQueue, String + label) throws InterruptedException { + assertEquals(autoCreateEnabledParentQueue.getLeafQueueTemplate() + .getQueueCapacities().getCapacity(label), + leafQueue.getQueueCapacities() + .getCapacity(label), EPSILON); + assertEquals(autoCreateEnabledParentQueue.getLeafQueueTemplate() + .getQueueCapacities().getMaximumCapacity(label), + leafQueue.getQueueCapacities() + .getMaximumCapacity(label), EPSILON); } protected void validateEffectiveMinResource(CSQueue leafQueue, @@ -621,8 +659,10 @@ public class TestCapacitySchedulerAutoCreatedQueueBase { } protected void validateActivatedQueueEntitlement(CSQueue parentQueue, - String leafQueueName, float expectedTotalChildQueueAbsCapacity, - List<QueueManagementChange> queueManagementChanges) + String leafQueueName, Map<String, Float> + expectedTotalChildQueueAbsCapacity, + List<QueueManagementChange> queueManagementChanges, Set<String> + expectedNodeLabels) throws SchedulerDynamicEditException { ManagedParentQueue autoCreateEnabledParentQueue = (ManagedParentQueue) parentQueue; @@ -633,67 +673,84 @@ public class TestCapacitySchedulerAutoCreatedQueueBase { QueueCapacities cap = autoCreateEnabledParentQueue.getLeafQueueTemplate() .getQueueCapacities(); - QueueEntitlement expectedEntitlement = new QueueEntitlement( - cap.getCapacity(), cap.getMaximumCapacity()); - //validate capacity - validateQueueEntitlements(leafQueueName, expectedEntitlement, - queueManagementChanges); + AutoCreatedLeafQueue leafQueue = (AutoCreatedLeafQueue) + cs.getQueue(leafQueueName); - //validate parent queue state - assertEquals(expectedTotalChildQueueAbsCapacity, - policy.getAbsoluteActivatedChildQueueCapacity(), EPSILON); + Map<String, QueueEntitlement> expectedEntitlements = new HashMap<>(); - AutoCreatedLeafQueue leafQueue = (AutoCreatedLeafQueue) cs.getQueue( - leafQueueName); + for (String label : expectedNodeLabels) { + //validate leaf queue state + assertEquals(true, policy.isActive(leafQueue, label)); + + QueueEntitlement expectedEntitlement = new QueueEntitlement( + cap.getCapacity(label), cap.getMaximumCapacity(label)); + + //validate parent queue state + assertEquals(expectedTotalChildQueueAbsCapacity.get(label), + policy.getAbsoluteActivatedChildQueueCapacity(label), EPSILON); + + expectedEntitlements.put(label, expectedEntitlement); + } - //validate leaf queue state - assertEquals(true, policy.isActive(leafQueue)); + //validate capacity + validateQueueEntitlements(leafQueueName, expectedEntitlements, + queueManagementChanges, expectedNodeLabels); } protected void validateDeactivatedQueueEntitlement(CSQueue parentQueue, - String leafQueueName, float expectedTotalChildQueueAbsCapacity, - List<QueueManagementChange> queueManagementChanges) + String leafQueueName, Map<String, Float> + expectedTotalChildQueueAbsCapacity, + List<QueueManagementChange> + queueManagementChanges) throws SchedulerDynamicEditException { - QueueEntitlement expectedEntitlement = new QueueEntitlement(0.0f, 1.0f); + QueueEntitlement expectedEntitlement = + new QueueEntitlement(0.0f, 1.0f); ManagedParentQueue autoCreateEnabledParentQueue = (ManagedParentQueue) parentQueue; - AutoCreatedLeafQueue leafQueue = (AutoCreatedLeafQueue) cs.getQueue( - leafQueueName); + AutoCreatedLeafQueue leafQueue = + (AutoCreatedLeafQueue) cs.getQueue(leafQueueName); GuaranteedOrZeroCapacityOverTimePolicy policy = (GuaranteedOrZeroCapacityOverTimePolicy) autoCreateEnabledParentQueue .getAutoCreatedQueueManagementPolicy(); - //validate parent queue state - assertEquals(expectedTotalChildQueueAbsCapacity, - policy.getAbsoluteActivatedChildQueueCapacity(), EPSILON); + Map<String, QueueEntitlement> expectedEntitlements = new HashMap<>(); - //validate leaf queue state - assertEquals(false, policy.isActive(leafQueue)); + for (String label : accessibleNodeLabelsOnC) { + //validate parent queue state + LOG.info("Validating label " + label); + assertEquals(expectedTotalChildQueueAbsCapacity.get(label), policy + .getAbsoluteActivatedChildQueueCapacity(label), EPSILON); + + //validate leaf queue state + assertEquals(false, policy.isActive(leafQueue, label)); + expectedEntitlements.put(label, expectedEntitlement); + } //validate capacity - validateQueueEntitlements(leafQueueName, expectedEntitlement, - queueManagementChanges); + validateQueueEntitlements(leafQueueName, expectedEntitlements, + queueManagementChanges, accessibleNodeLabelsOnC); } - private void validateQueueEntitlements(String leafQueueName, - QueueEntitlement expectedEntitlement, - List<QueueManagementChange> queueEntitlementChanges) { + void validateQueueEntitlements(String leafQueueName, + Map<String, QueueEntitlement> expectedEntitlements, + List<QueueManagementChange> + queueEntitlementChanges, Set<String> expectedNodeLabels) { AutoCreatedLeafQueue leafQueue = (AutoCreatedLeafQueue) cs.getQueue( leafQueueName); - validateQueueEntitlementChangesForLeafQueue(leafQueue, expectedEntitlement, - queueEntitlementChanges); + validateQueueEntitlementChanges(leafQueue, expectedEntitlements, + queueEntitlementChanges, expectedNodeLabels); } - private void validateQueueEntitlementChangesForLeafQueue(CSQueue leafQueue, - QueueEntitlement expectedQueueEntitlement, - final List<QueueManagementChange> queueEntitlementChanges) { + private void validateQueueEntitlementChanges(AutoCreatedLeafQueue leafQueue, + Map<String, QueueEntitlement> expectedQueueEntitlements, + final List<QueueManagementChange> queueEntitlementChanges, Set<String> + expectedNodeLabels) { boolean found = false; - Map<String, QueueEntitlement> expectedQueueEntitlements = new HashMap<>(); for (QueueManagementChange entitlementChange : queueEntitlementChanges) { if (leafQueue.getQueueName().equals( entitlementChange.getQueue().getQueueName())) { @@ -701,13 +758,12 @@ public class TestCapacitySchedulerAutoCreatedQueueBase { AutoCreatedLeafQueueConfig updatedQueueTemplate = entitlementChange.getUpdatedQueueTemplate(); - for (String label : accessibleNodeLabelsOnC) { + for (String label : expectedNodeLabels) { QueueEntitlement newEntitlement = new QueueEntitlement( updatedQueueTemplate.getQueueCapacities().getCapacity(label), - updatedQueueTemplate.getQueueCapacities() - .getMaximumCapacity(label)); - assertEquals(expectedQueueEntitlement, newEntitlement); - expectedQueueEntitlements.put(label, expectedQueueEntitlement); + updatedQueueTemplate.getQueueCapacities().getMaximumCapacity + (label)); + assertEquals(expectedQueueEntitlements.get(label), newEntitlement); validateEffectiveMinResource(leafQueue, label, expectedQueueEntitlements); } @@ -716,9 +772,20 @@ public class TestCapacitySchedulerAutoCreatedQueueBase { } } if (!found) { - fail("Could not find the specified leaf queue in entitlement changes : " - + leafQueue.getQueueName()); + fail( + "Could not find the specified leaf queue in entitlement changes : " + + leafQueue.getQueueName()); } } + protected Map<String, Float> populateExpectedAbsCapacityByLabelForParentQueue + (int numLeafQueues) { + Map<String, Float> expectedChildQueueAbsCapacity = new HashMap<>(); + expectedChildQueueAbsCapacity.put(NODEL_LABEL_GPU, + NODE_LABEL_GPU_TEMPLATE_CAPACITY/100 * numLeafQueues); + expectedChildQueueAbsCapacity.put(NODEL_LABEL_SSD, + NODEL_LABEL_SSD_TEMPLATE_CAPACITY/100 * numLeafQueues); + expectedChildQueueAbsCapacity.put(NO_LABEL, 0.1f * numLeafQueues); + return expectedChildQueueAbsCapacity; + } }
http://git-wip-us.apache.org/repos/asf/hadoop/blob/821b0de4/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoQueueCreation.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoQueueCreation.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoQueueCreation.java index 027d58c..0a530dd 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoQueueCreation.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoQueueCreation.java @@ -72,15 +72,18 @@ import org.junit.Test; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; import static org.apache.hadoop.yarn.nodelabels.CommonNodeLabelsManager .NO_LABEL; -import static org.apache.hadoop.yarn.server.resourcemanager.placement - .UserGroupMappingPlacementRule.CURRENT_USER_MAPPING; -import static org.apache.hadoop.yarn.server.resourcemanager.scheduler - .capacity.CSQueueUtils.EPSILON; +import static org.apache.hadoop.yarn.server.resourcemanager.placement.UserGroupMappingPlacementRule.CURRENT_USER_MAPPING; +import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CSQueueUtils.EPSILON; + + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -90,7 +93,7 @@ import static org.mockito.Mockito.when; /** * Tests for creation and reinitialization of auto created leaf queues - * under a ManagedParentQueue. + * and capacity management under a ManagedParentQueue. */ public class TestCapacitySchedulerAutoQueueCreation extends TestCapacitySchedulerAutoCreatedQueueBase { @@ -105,7 +108,7 @@ public class TestCapacitySchedulerAutoQueueCreation 4); - @Test(timeout = 10000) + @Test(timeout = 20000) public void testAutoCreateLeafQueueCreation() throws Exception { try { @@ -122,7 +125,12 @@ public class TestCapacitySchedulerAutoQueueCreation ManagedParentQueue parentQueue = (ManagedParentQueue) cs.getQueue( PARENT_QUEUE); assertEquals(parentQueue, autoCreatedLeafQueue.getParent()); - validateInitialQueueEntitlement(parentQueue, USER0, 0.1f, accessibleNodeLabelsOnC); + + Map<String, Float> expectedChildQueueAbsCapacity = + populateExpectedAbsCapacityByLabelForParentQueue(1); + validateInitialQueueEntitlement(parentQueue, USER0, + expectedChildQueueAbsCapacity, accessibleNodeLabelsOnC); + validateUserAndAppLimits(autoCreatedLeafQueue, 1000, 1000); assertTrue(autoCreatedLeafQueue @@ -136,7 +144,14 @@ public class TestCapacitySchedulerAutoQueueCreation (AutoCreatedLeafQueue) cs.getQueue(TEST_GROUPUSER); parentQueue = (ManagedParentQueue) cs.getQueue("d"); assertEquals(parentQueue, autoCreatedLeafQueue.getParent()); - validateInitialQueueEntitlement(parentQueue, TEST_GROUPUSER, 0.02f, + + expectedChildQueueAbsCapacity = + new HashMap<String, Float>() {{ + put(NO_LABEL, 0.02f); + }}; + + validateInitialQueueEntitlement(parentQueue, TEST_GROUPUSER, + expectedChildQueueAbsCapacity, new HashSet<String>() {{ add(NO_LABEL); }}); } finally { @@ -173,10 +188,17 @@ public class TestCapacitySchedulerAutoQueueCreation USER0); ManagedParentQueue parentQueue = (ManagedParentQueue) cs.getQueue( PARENT_QUEUE); + assertEquals(parentQueue, user0Queue.getParent()); assertEquals(parentQueue, user1Queue.getParent()); - validateInitialQueueEntitlement(parentQueue, USER0, 0.2f, accessibleNodeLabelsOnC); - validateInitialQueueEntitlement(parentQueue, USER1, 0.2f, accessibleNodeLabelsOnC); + + Map<String, Float> + expectedAbsChildQueueCapacity = + populateExpectedAbsCapacityByLabelForParentQueue(2); + validateInitialQueueEntitlement(parentQueue, USER0, + expectedAbsChildQueueCapacity, accessibleNodeLabelsOnC); + validateInitialQueueEntitlement(parentQueue, USER1, + expectedAbsChildQueueCapacity, accessibleNodeLabelsOnC); ApplicationAttemptId appAttemptId = appsInC.get(0); @@ -184,7 +206,8 @@ public class TestCapacitySchedulerAutoQueueCreation RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory( null); ResourceRequest r1 = TestUtils.createResourceRequest(ResourceRequest.ANY, - 1 * GB, 1, true, priority, recordFactory); + 1 * GB, 1, true, priority, + recordFactory); cs.allocate(appAttemptId, Collections.<ResourceRequest>singletonList(r1), null, Collections.<ContainerId>emptyList(), Collections.singletonList(host), @@ -216,8 +239,12 @@ public class TestCapacitySchedulerAutoQueueCreation AutoCreatedLeafQueue leafQueue = (AutoCreatedLeafQueue) cs.getQueue( USER1); + + expectedAbsChildQueueCapacity = + populateExpectedAbsCapacityByLabelForParentQueue(1); + validateInitialQueueEntitlement(parentQueue, leafQueue.getQueueName(), - 0.1f, accessibleNodeLabelsOnC); + expectedAbsChildQueueCapacity, accessibleNodeLabelsOnC); } finally { cleanupQueue(USER0); @@ -498,52 +525,80 @@ public class TestCapacitySchedulerAutoQueueCreation CSQueue parentQueue = cs.getQueue(PARENT_QUEUE); //submit app1 as USER1 - submitApp(mockRM, parentQueue, USER1, USER1, 1, 1); - validateInitialQueueEntitlement(parentQueue, USER1, 0.1f, accessibleNodeLabelsOnC); + ApplicationId user1AppId = submitApp(mockRM, parentQueue, USER1, USER1, + 1, 1); + Map<String, Float> expectedAbsChildQueueCapacity = + populateExpectedAbsCapacityByLabelForParentQueue(1); + validateInitialQueueEntitlement(parentQueue, USER1, + expectedAbsChildQueueCapacity, accessibleNodeLabelsOnC); //submit another app2 as USER2 ApplicationId user2AppId = submitApp(mockRM, parentQueue, USER2, USER2, 2, 1); - validateInitialQueueEntitlement(parentQueue, USER2, 0.2f, accessibleNodeLabelsOnC); + + expectedAbsChildQueueCapacity = + populateExpectedAbsCapacityByLabelForParentQueue(2); + validateInitialQueueEntitlement(parentQueue, USER2, + expectedAbsChildQueueCapacity, accessibleNodeLabelsOnC); //submit another app3 as USER1 submitApp(mockRM, parentQueue, USER1, USER1, 3, 2); //validate total activated abs capacity remains the same GuaranteedOrZeroCapacityOverTimePolicy autoCreatedQueueManagementPolicy = - (GuaranteedOrZeroCapacityOverTimePolicy) ((ManagedParentQueue) - parentQueue) + (GuaranteedOrZeroCapacityOverTimePolicy) ((ManagedParentQueue) parentQueue) .getAutoCreatedQueueManagementPolicy(); - assertEquals(autoCreatedQueueManagementPolicy - .getAbsoluteActivatedChildQueueCapacity(), 0.2f, EPSILON); - //submit user_3 app. This cant be scheduled since there is no capacity + for (String nodeLabel : accessibleNodeLabelsOnC) { + assertEquals(expectedAbsChildQueueCapacity.get(nodeLabel), + autoCreatedQueueManagementPolicy.getAbsoluteActivatedChildQueueCapacity(nodeLabel), EPSILON); + } + + //submit user_3 app. This cant be allocated since there is no capacity + // in NO_LABEL, SSD but can be in GPU label submitApp(mockRM, parentQueue, USER3, USER3, 4, 1); final CSQueue user3LeafQueue = cs.getQueue(USER3); validateCapacities((AutoCreatedLeafQueue) user3LeafQueue, 0.0f, 0.0f, 1.0f, 1.0f); - - assertEquals(autoCreatedQueueManagementPolicy - .getAbsoluteActivatedChildQueueCapacity(), 0.2f, EPSILON); - - //deactivate USER2 queue + validateCapacitiesByLabel((ManagedParentQueue) parentQueue, + (AutoCreatedLeafQueue) + user3LeafQueue, NODEL_LABEL_GPU); + + assertEquals(0.2f, autoCreatedQueueManagementPolicy + .getAbsoluteActivatedChildQueueCapacity(NO_LABEL), EPSILON); + assertEquals(0.9f, autoCreatedQueueManagementPolicy.getAbsoluteActivatedChildQueueCapacity(NODEL_LABEL_GPU), + EPSILON); + + //Verify that AMs can be allocated + //Node 1 has SSD and default node label expression on C is SSD. + //This validates that the default node label expression with SSD is set + // on the AM attempt + // and app attempt reaches ALLOCATED state for a dynamic queue 'USER1' + mockRM.launchAM(mockRM.getRMContext().getRMApps().get(user1AppId), + mockRM, nm1); + +// //deactivate USER2 queue cs.killAllAppsInQueue(USER2); mockRM.waitForState(user2AppId, RMAppState.KILLED); - //Verify if USER_2 can be deactivated since it has no pending appsA + //Verify if USER_2 can be deactivated since it has no pending apps List<QueueManagementChange> queueManagementChanges = autoCreatedQueueManagementPolicy.computeQueueManagementChanges(); ManagedParentQueue managedParentQueue = (ManagedParentQueue) parentQueue; - managedParentQueue.validateAndApplyQueueManagementChanges( - queueManagementChanges); + managedParentQueue. + validateAndApplyQueueManagementChanges(queueManagementChanges); - validateDeactivatedQueueEntitlement(parentQueue, USER2, 0.2f, - queueManagementChanges); + validateDeactivatedQueueEntitlement(parentQueue, USER2, + expectedAbsChildQueueCapacity, queueManagementChanges); - //USER_3 should now get activated - validateActivatedQueueEntitlement(parentQueue, USER3, 0.2f, - queueManagementChanges); + //USER_3 should now get activated for SSD, NO_LABEL + Set<String> expectedNodeLabelsUpdated = new HashSet<>(); + expectedNodeLabelsUpdated.add(NO_LABEL); + expectedNodeLabelsUpdated.add(NODEL_LABEL_SSD); + + validateActivatedQueueEntitlement(parentQueue, USER3, + expectedAbsChildQueueCapacity , queueManagementChanges, expectedNodeLabelsUpdated); } finally { cleanupQueue(USER1); @@ -565,13 +620,18 @@ public class TestCapacitySchedulerAutoQueueCreation //submit app1 as USER1 submitApp(newMockRM, parentQueue, USER1, USER1, 1, 1); - validateInitialQueueEntitlement(newCS, parentQueue, USER1, 0.1f, accessibleNodeLabelsOnC); - CSQueue user1LeafQueue = newCS.getQueue(USER1); + Map<String, Float> expectedAbsChildQueueCapacity = + populateExpectedAbsCapacityByLabelForParentQueue(1); + validateInitialQueueEntitlement(newCS, parentQueue, USER1, + expectedAbsChildQueueCapacity, accessibleNodeLabelsOnC); //submit another app2 as USER2 - submitApp(newMockRM, parentQueue, USER2, USER2, 2, 1); - validateInitialQueueEntitlement(newCS, parentQueue, USER2, 0.2f, accessibleNodeLabelsOnC); - CSQueue user2LeafQueue = newCS.getQueue(USER2); + ApplicationId user2AppId = submitApp(newMockRM, parentQueue, USER2, USER2, 2, + 1); + expectedAbsChildQueueCapacity = + populateExpectedAbsCapacityByLabelForParentQueue(2); + validateInitialQueueEntitlement(newCS, parentQueue, USER2, + expectedAbsChildQueueCapacity, accessibleNodeLabelsOnC); //validate total activated abs capacity remains the same GuaranteedOrZeroCapacityOverTimePolicy autoCreatedQueueManagementPolicy = @@ -579,7 +639,7 @@ public class TestCapacitySchedulerAutoQueueCreation parentQueue) .getAutoCreatedQueueManagementPolicy(); assertEquals(autoCreatedQueueManagementPolicy - .getAbsoluteActivatedChildQueueCapacity(), 0.2f, EPSILON); + .getAbsoluteActivatedChildQueueCapacity(NO_LABEL), 0.2f, EPSILON); //submit user_3 app. This cant be scheduled since there is no capacity submitApp(newMockRM, parentQueue, USER3, USER3, 3, 1); @@ -588,7 +648,7 @@ public class TestCapacitySchedulerAutoQueueCreation 1.0f, 1.0f); assertEquals(autoCreatedQueueManagementPolicy - .getAbsoluteActivatedChildQueueCapacity(), 0.2f, EPSILON); + .getAbsoluteActivatedChildQueueCapacity(NO_LABEL), 0.2f, EPSILON); // add new NM. newMockRM.registerNode("127.0.0.3:1234", 125 * GB, 20); @@ -596,31 +656,33 @@ public class TestCapacitySchedulerAutoQueueCreation // There will be change in effective resource when nodes are added // since we deal with percentages - Resource MAX_RES = Resources.addTo(TEMPLATE_MAX_RES, - Resources.createResource(125 * GB, 20)); + Resource MAX_RES = Resources.addTo(TEMPLATE_MAX_RES, Resources.createResource(125 * + GB, 20)); Resource MIN_RES = Resources.createResource(14438, 6); Assert.assertEquals("Effective Min resource for USER3 is not correct", - Resources.none(), - user3LeafQueue.getQueueResourceQuotas().getEffectiveMinResource()); + Resources.none(), user3LeafQueue.getQueueResourceQuotas() + .getEffectiveMinResource()); Assert.assertEquals("Effective Max resource for USER3 is not correct", - MAX_RES, - user3LeafQueue.getQueueResourceQuotas().getEffectiveMaxResource()); + MAX_RES, user3LeafQueue + .getQueueResourceQuotas() + .getEffectiveMaxResource()); + CSQueue user1LeafQueue = newCS.getQueue(USER1); + CSQueue user2LeafQueue = newCS.getQueue(USER2); Assert.assertEquals("Effective Min resource for USER2 is not correct", - MIN_RES, - user1LeafQueue.getQueueResourceQuotas().getEffectiveMinResource()); + MIN_RES, user1LeafQueue.getQueueResourceQuotas() + .getEffectiveMinResource()); Assert.assertEquals("Effective Max resource for USER2 is not correct", - MAX_RES, - user1LeafQueue.getQueueResourceQuotas().getEffectiveMaxResource()); + MAX_RES, user1LeafQueue.getQueueResourceQuotas().getEffectiveMaxResource()); Assert.assertEquals("Effective Min resource for USER1 is not correct", - MIN_RES, - user2LeafQueue.getQueueResourceQuotas().getEffectiveMinResource()); + MIN_RES, user2LeafQueue.getQueueResourceQuotas() + .getEffectiveMinResource()); Assert.assertEquals("Effective Max resource for USER1 is not correct", - MAX_RES, - user2LeafQueue.getQueueResourceQuotas().getEffectiveMaxResource()); + MAX_RES, user2LeafQueue.getQueueResourceQuotas() + .getEffectiveMaxResource()); // unregister one NM. newMockRM.unRegisterNode(nm3); @@ -629,11 +691,11 @@ public class TestCapacitySchedulerAutoQueueCreation // After loosing one NM, resources will reduce Assert.assertEquals("Effective Min resource for USER2 is not correct", - MIN_RES_UPDATED, - user1LeafQueue.getQueueResourceQuotas().getEffectiveMinResource()); + MIN_RES_UPDATED, user1LeafQueue.getQueueResourceQuotas().getEffectiveMinResource + ()); Assert.assertEquals("Effective Max resource for USER2 is not correct", - MAX_RES_UPDATED, - user2LeafQueue.getQueueResourceQuotas().getEffectiveMaxResource()); + MAX_RES_UPDATED, user2LeafQueue.getQueueResourceQuotas() + .getEffectiveMaxResource()); } finally { cleanupQueue(USER1); @@ -647,25 +709,6 @@ public class TestCapacitySchedulerAutoQueueCreation } @Test - public void testAutoCreatedQueueInheritsNodeLabels() throws Exception { - - try { - String host = "127.0.0.1"; - RMNode node = MockNodes.newNodeInfo(0, MockNodes.newResource(4 * GB), 1, - host); - cs.handle(new NodeAddedSchedulerEvent(node)); - - CSQueue parentQueue = cs.getQueue(PARENT_QUEUE); - - submitApp(USER1, USER1, NODEL_LABEL_GPU); - //submit app1 as USER1 - validateInitialQueueEntitlement(parentQueue, USER1, 0.1f, accessibleNodeLabelsOnC); - } finally { - cleanupQueue(USER1); - } - } - - @Test public void testReinitializeQueuesWithAutoCreatedLeafQueues() throws Exception { @@ -679,12 +722,20 @@ public class TestCapacitySchedulerAutoQueueCreation //submit app1 as USER1 submitApp(newMockRM, parentQueue, USER1, USER1, 1, 1); - validateInitialQueueEntitlement(newCS, parentQueue, USER1, 0.1f, accessibleNodeLabelsOnC); + + Map<String, Float> expectedChildQueueAbsCapacity = + populateExpectedAbsCapacityByLabelForParentQueue(1); + validateInitialQueueEntitlement(newCS, parentQueue, USER1, + expectedChildQueueAbsCapacity, accessibleNodeLabelsOnC); //submit another app2 as USER2 - ApplicationId user2AppId = submitApp(newMockRM, parentQueue, USER2, USER2, - 2, 1); - validateInitialQueueEntitlement(newCS, parentQueue, USER2, 0.2f, accessibleNodeLabelsOnC); + ApplicationId user2AppId = submitApp(newMockRM, parentQueue, USER2, + USER2, 2, + 1); + expectedChildQueueAbsCapacity = + populateExpectedAbsCapacityByLabelForParentQueue(2); + validateInitialQueueEntitlement(newCS, parentQueue, USER2, + expectedChildQueueAbsCapacity, accessibleNodeLabelsOnC); //update parent queue capacity conf.setCapacity(C, 30f); @@ -709,19 +760,27 @@ public class TestCapacitySchedulerAutoQueueCreation //submit app1 as USER3 submitApp(newMockRM, parentQueue, USER3, USER3, 3, 1); - validateInitialQueueEntitlement(newCS, parentQueue, USER3, 0.27f, accessibleNodeLabelsOnC); - AutoCreatedLeafQueue user3Queue = (AutoCreatedLeafQueue) newCS.getQueue( - USER1); - validateCapacities(user3Queue, 0.3f, 0.09f, 0.4f, 0.2f); + AutoCreatedLeafQueue user3Queue = + (AutoCreatedLeafQueue) newCS.getQueue(USER1); + validateCapacities(user3Queue, 0.3f, 0.09f, 0.4f,0.2f); + validateUserAndAppLimits(user3Queue, 900, 900); //submit app1 as USER1 - is already activated. there should be no diff // in capacities submitApp(newMockRM, parentQueue, USER3, USER3, 4, 2); - validateInitialQueueEntitlement(newCS, parentQueue, USER3, 0.27f, accessibleNodeLabelsOnC); - validateCapacities(user3Queue, 0.3f, 0.09f, 0.4f, 0.2f); + + validateCapacities(user3Queue, 0.3f, 0.09f, 0.4f,0.2f); + validateUserAndAppLimits(user3Queue, 900, 900); + GuaranteedOrZeroCapacityOverTimePolicy autoCreatedQueueManagementPolicy = + (GuaranteedOrZeroCapacityOverTimePolicy) ((ManagedParentQueue) + parentQueue) + .getAutoCreatedQueueManagementPolicy(); + assertEquals(0.27f, autoCreatedQueueManagementPolicy + .getAbsoluteActivatedChildQueueCapacity + (NO_LABEL), EPSILON); } finally { cleanupQueue(USER1); cleanupQueue(USER2); http://git-wip-us.apache.org/repos/asf/hadoop/blob/821b0de4/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestQueueManagementDynamicEditPolicy.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestQueueManagementDynamicEditPolicy.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestQueueManagementDynamicEditPolicy.java index 5ff249f..66b488d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestQueueManagementDynamicEditPolicy.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestQueueManagementDynamicEditPolicy.java @@ -24,7 +24,10 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity import org.junit.Before; import org.junit.Test; +import java.util.Map; +import static org.apache.hadoop.yarn.nodelabels.CommonNodeLabelsManager + .NO_LABEL; import static org.apache.hadoop.yarn.server.resourcemanager.scheduler .capacity.CSQueueUtils.EPSILON; import static org.junit.Assert.assertEquals; @@ -54,21 +57,27 @@ public class TestQueueManagementDynamicEditPolicy extends parentQueue) .getAutoCreatedQueueManagementPolicy(); assertEquals(0f, autoCreatedQueueManagementPolicy - .getAbsoluteActivatedChildQueueCapacity(), EPSILON); + .getAbsoluteActivatedChildQueueCapacity(NO_LABEL), EPSILON); //submit app1 as USER1 ApplicationId user1AppId = submitApp(mockRM, parentQueue, USER1, USER1, 1, 1); - validateInitialQueueEntitlement(parentQueue, USER1, 0.1f, accessibleNodeLabelsOnC); + Map<String, Float> expectedAbsChildQueueCapacity = + populateExpectedAbsCapacityByLabelForParentQueue(1); + validateInitialQueueEntitlement(parentQueue, USER1, + expectedAbsChildQueueCapacity, accessibleNodeLabelsOnC); //submit another app2 as USER2 ApplicationId user2AppId = submitApp(mockRM, parentQueue, USER2, USER2, 2, 1); - validateInitialQueueEntitlement(parentQueue, USER2, 0.2f, accessibleNodeLabelsOnC); + expectedAbsChildQueueCapacity = + populateExpectedAbsCapacityByLabelForParentQueue(2); + validateInitialQueueEntitlement(parentQueue, USER2, + expectedAbsChildQueueCapacity, accessibleNodeLabelsOnC); //validate total activated abs capacity assertEquals(0.2f, autoCreatedQueueManagementPolicy - .getAbsoluteActivatedChildQueueCapacity(), EPSILON); + .getAbsoluteActivatedChildQueueCapacity(NO_LABEL), EPSILON); //submit user_3 app. This cant be scheduled since there is no capacity submitApp(mockRM, parentQueue, USER3, USER3, 3, 1); @@ -77,7 +86,7 @@ public class TestQueueManagementDynamicEditPolicy extends 1.0f, 1.0f); assertEquals(autoCreatedQueueManagementPolicy - .getAbsoluteActivatedChildQueueCapacity(), 0.2f, EPSILON); + .getAbsoluteActivatedChildQueueCapacity(NO_LABEL), 0.2f, EPSILON); //deactivate USER2 queue cs.killAllAppsInQueue(USER2); @@ -88,8 +97,8 @@ public class TestQueueManagementDynamicEditPolicy extends mockRM.waitForState(user1AppId, RMAppState.KILLED); policy.editSchedule(); - - waitForPolicyState(0.1f, autoCreatedQueueManagementPolicy, 1000); + waitForPolicyState(0.1f, autoCreatedQueueManagementPolicy, NO_LABEL, + 1000); validateCapacities((AutoCreatedLeafQueue) user3LeafQueue, 0.5f, 0.1f, 1.0f, 1.0f); @@ -105,13 +114,12 @@ public class TestQueueManagementDynamicEditPolicy extends } private void waitForPolicyState(float expectedVal, - GuaranteedOrZeroCapacityOverTimePolicy queueManagementPolicy, int - timesec) throws - InterruptedException { + GuaranteedOrZeroCapacityOverTimePolicy queueManagementPolicy, String + nodeLabel, int timesec) throws InterruptedException { long start = System.currentTimeMillis(); while (System.currentTimeMillis() - start < timesec * 1000) { if (Float.compare(expectedVal, queueManagementPolicy - .getAbsoluteActivatedChildQueueCapacity()) != 0) { + .getAbsoluteActivatedChildQueueCapacity(nodeLabel)) > EPSILON) { Thread.sleep(100); } else { break; --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-commits-h...@hadoop.apache.org