From c2a1a055e72d131ff937df6fb3aab03d649fc04e Mon Sep 17 00:00:00 2001 From: Sunil G Date: Tue, 26 Jun 2018 18:58:35 -0700 Subject: [PATCH] YARN-8453-testcase --- ...estCapacitySchedulerWithMultiResourceTypes.java | 149 ++++++++++++++++++++- 1 file changed, 148 insertions(+), 1 deletion(-) 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/TestCapacitySchedulerWithMultiResourceTypes.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/TestCapacitySchedulerWithMultiResourceTypes.java index 3a8d33af6d8..81d1e68e0a0 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/TestCapacitySchedulerWithMultiResourceTypes.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/TestCapacitySchedulerWithMultiResourceTypes.java @@ -19,28 +19,44 @@ package org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity; import org.apache.hadoop.yarn.api.protocolrecords.ResourceTypes; -import org.apache.hadoop.yarn.api.records.ResourceInformation; +import org.apache.hadoop.yarn.api.records.*; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.exceptions.YarnRuntimeException; +import org.apache.hadoop.yarn.server.resourcemanager.MockAM; +import org.apache.hadoop.yarn.server.resourcemanager.MockNM; import org.apache.hadoop.yarn.server.resourcemanager.MockRM; import org.apache.hadoop.yarn.server.resourcemanager.resource.TestResourceProfiles; +import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp; +import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt; +import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainerState; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerNodeReport; import org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator; import org.apache.hadoop.yarn.util.resource.DominantResourceCalculator; import org.apache.hadoop.yarn.util.resource.ResourceUtils; +import org.apache.hadoop.yarn.util.resource.Resources; import org.junit.Assert; import org.junit.Test; import java.io.IOException; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import static org.apache.hadoop.yarn.conf.YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_MB; +import static org.apache.hadoop.yarn.conf.YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_VCORES; + /** * Test Capacity Scheduler with multiple resource types. */ public class TestCapacitySchedulerWithMultiResourceTypes { private static String RESOURCE_1 = "res1"; + protected static final String A = CapacitySchedulerConfiguration.ROOT + ".a"; + protected static final String B = CapacitySchedulerConfiguration.ROOT + ".b"; + protected static float A_CAPACITY = 50.0f; + protected static float B_CAPACITY = 50.0f; + @Test public void testMaximumAllocationRefreshWithMultipleResourceTypes() throws Exception { @@ -213,4 +229,135 @@ public void testDefaultResourceCalculatorWithThirdResourceTypes() throws Excepti Assert.assertTrue("Should have exception in CS", exception); } + + @Test + public void testMaxLimitsOfQueueWithMultipleResources() throws Exception { + + int GB = 1024; + // Initialize resource map + Map riMap = new HashMap<>(); + + // Initialize mandatory resources + ResourceInformation memory = ResourceInformation.newInstance( + ResourceInformation.MEMORY_MB.getName(), + ResourceInformation.MEMORY_MB.getUnits(), + YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_MB, + YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_MB); + ResourceInformation vcores = ResourceInformation.newInstance( + ResourceInformation.VCORES.getName(), + ResourceInformation.VCORES.getUnits(), + YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_VCORES, + YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_VCORES); + riMap.put(ResourceInformation.MEMORY_URI, memory); + riMap.put(ResourceInformation.VCORES_URI, vcores); + riMap.put(ResourceInformation.GPU_URI, + ResourceInformation.newInstance(ResourceInformation.GPU_URI, "", 0, + ResourceTypes.COUNTABLE, 0, 3333L)); + + ResourceUtils.initializeResourcesFromResourceInformationMap(riMap); + + CapacitySchedulerConfiguration csconf = + new CapacitySchedulerConfiguration(); + csconf.setMaximumApplicationMasterResourcePerQueuePercent("root", 100.0f); + csconf.setMaximumAMResourcePercentPerPartition("root", "", 100.0f); + csconf.setMaximumApplicationMasterResourcePerQueuePercent("root.default", + 100.0f); + csconf.setMaximumAMResourcePercentPerPartition("root.default", "", 100.0f); + csconf.setResourceComparator(DominantResourceCalculator.class); + csconf.set(YarnConfiguration.RESOURCE_TYPES, ResourceInformation.GPU_URI); + + // Define top-level queues + csconf.setQueues(CapacitySchedulerConfiguration.ROOT, new String[] {"a", "b"}); + + // Set each queue to consider 50% each. + csconf.setCapacity(A, A_CAPACITY); + csconf.setCapacity(B, B_CAPACITY); + csconf.setMaximumCapacity(A, 100.0f); + csconf.setUserLimitFactor(A, 2); + + YarnConfiguration conf = new YarnConfiguration(csconf); + // Don't reset resource types since we have already configured resource + // types + conf.setBoolean(TestResourceProfiles.TEST_CONF_RESET_RESOURCE_TYPES, false); + conf.setClass(YarnConfiguration.RM_SCHEDULER, CapacityScheduler.class, + ResourceScheduler.class); + + MockRM rm = new MockRM(conf); + rm.start(); + + Map nameToValues = new HashMap<>(); + nameToValues.put(ResourceInformation.GPU_URI, 4); + // Register NM1 with 10GB memory, 4 CPU and 4 GPU + MockNM nm1 = rm.registerNode("127.0.0.1:1234", TestUtils + .createResource(10 * GB, + 4, nameToValues)); + + nameToValues.clear(); + // Register NM1 with 10GB memory, 4 CPU and 0 GPU + MockNM nm2 = rm.registerNode("127.0.0.1:1235", TestUtils + .createResource(10 * GB, + 4, nameToValues)); + + RMApp app1 = rm.submitApp(1024, "app-1", "user1", null, "a"); + MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1); + + SchedulerNodeReport report_nm1 = + rm.getResourceScheduler().getNodeReport(nm1.getNodeId()); + + // check node report + Assert.assertEquals(1 * GB, report_nm1.getUsedResource().getMemorySize()); + Assert.assertEquals(9 * GB, + report_nm1.getAvailableResource().getMemorySize()); + Assert.assertEquals(0, report_nm1.getUsedResource() + .getResourceInformation(ResourceInformation.GPU_URI).getValue()); + Assert.assertEquals(4, report_nm1.getAvailableResource() + .getResourceInformation(ResourceInformation.GPU_URI).getValue()); + + nameToValues.put(ResourceInformation.GPU_URI, 4); + Resource containerGpuResource = TestUtils + .createResource(1 * GB, + 1, nameToValues); + + // Allocate one container which takes all 4 GPU + am1.allocate( + Arrays.asList(ResourceRequest.newInstance(Priority.newInstance(1), + "*", containerGpuResource, 1)), + null); + ContainerId containerId2 = + ContainerId.newContainerId(am1.getApplicationAttemptId(), 2); + Assert.assertTrue(rm.waitForState(nm1, containerId2, + RMContainerState.ALLOCATED)); + // Acquire this container + am1.allocate(null, null); + + report_nm1 = + rm.getResourceScheduler().getNodeReport(nm1.getNodeId()); + Assert.assertEquals(2 * GB, report_nm1.getUsedResource().getMemorySize()); + Assert.assertEquals(4, report_nm1.getUsedResource() + .getResourceInformation(ResourceInformation.GPU_URI).getValue()); + Assert.assertEquals(0, report_nm1.getAvailableResource() + .getResourceInformation(ResourceInformation.GPU_URI).getValue()); + + nameToValues.clear(); + Resource containerResource = TestUtils + .createResource(1 * GB, + 1, nameToValues); + // Allocate one more containers which doesnt need GPU + am1.allocate( + Arrays.asList(ResourceRequest.newInstance(Priority.newInstance(1), + "*", containerResource, 1)), + null); + ContainerId containerId3 = + ContainerId.newContainerId(am1.getApplicationAttemptId(), 3); + Assert.assertTrue(rm.waitForState(nm1, containerId3, + RMContainerState.ALLOCATED)); + + report_nm1 = + rm.getResourceScheduler().getNodeReport(nm1.getNodeId()); + Assert.assertEquals(3 * GB, report_nm1.getUsedResource().getMemorySize()); + Assert.assertEquals(4, report_nm1.getUsedResource() + .getResourceInformation(ResourceInformation.GPU_URI).getValue()); + Assert.assertEquals(0, report_nm1.getAvailableResource() + .getResourceInformation(ResourceInformation.GPU_URI).getValue()); + } } -- 2.14.3 (Apple Git-98)