diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-submarine/src/main/java/org/apache/hadoop/yarn/submarine/client/cli/CliUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-submarine/src/main/java/org/apache/hadoop/yarn/submarine/client/cli/CliUtils.java index f3eee7c274e..c00bc2c6498 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-submarine/src/main/java/org/apache/hadoop/yarn/submarine/client/cli/CliUtils.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-submarine/src/main/java/org/apache/hadoop/yarn/submarine/client/cli/CliUtils.java @@ -16,23 +16,15 @@ import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.security.UserGroupInformation; -import org.apache.hadoop.yarn.api.records.Resource; -import org.apache.hadoop.yarn.api.records.ResourceInformation; -import org.apache.hadoop.yarn.api.records.ResourceTypeInfo; -import org.apache.hadoop.yarn.exceptions.ResourceNotFoundException; -import org.apache.hadoop.yarn.exceptions.YarnException; import org.apache.hadoop.yarn.submarine.client.cli.param.RunJobParameters; import org.apache.hadoop.yarn.submarine.common.exception.SubmarineRuntimeException; import org.apache.hadoop.yarn.submarine.common.fs.RemoteDirectoryManager; -import org.apache.hadoop.yarn.util.UnitsConversionUtil; -import org.apache.hadoop.yarn.util.resource.ResourceUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; import java.util.HashMap; -import java.util.List; import java.util.Map; import static org.apache.hadoop.yarn.submarine.client.cli.CliConstants.KEYTAB; @@ -41,7 +33,6 @@ public class CliUtils { private static final Logger LOG = LoggerFactory.getLogger(CliUtils.class); - private final static String RES_PATTERN = "^[^=]+=\\d+\\s?\\w*$"; /** * Replace patterns inside cli * @@ -74,86 +65,6 @@ public static String replacePatternsInLaunchCommand(String specifiedCli, return newCli; } - private static Map parseResourcesString(String resourcesStr) { - Map resources = new HashMap<>(); - String[] pairs = resourcesStr.trim().split(","); - for (String resource : pairs) { - resource = resource.trim(); - if (!resource.matches(RES_PATTERN)) { - throw new IllegalArgumentException("\"" + resource + "\" is not a " - + "valid resource type/amount pair. " - + "Please provide key=amount pairs separated by commas."); - } - String[] splits = resource.split("="); - String key = splits[0], value = splits[1]; - String units = ResourceUtils.getUnits(value); - - String valueWithoutUnit = value.substring(0, - value.length()- units.length()).trim(); - long resourceValue = Long.parseLong(valueWithoutUnit); - - // Convert commandline unit to standard YARN unit. - if (units.equals("M") || units.equals("m")) { - units = "Mi"; - } else if (units.equals("G") || units.equals("g")) { - units = "Gi"; - } else if (units.isEmpty()) { - // do nothing; - } else { - throw new IllegalArgumentException("Acceptable units are M/G or empty"); - } - - // special handle memory-mb and memory - if (key.equals(ResourceInformation.MEMORY_URI)) { - if (!units.isEmpty()) { - resourceValue = UnitsConversionUtil.convert(units, "Mi", - resourceValue); - } - } - - if (key.equals("memory")) { - key = ResourceInformation.MEMORY_URI; - resourceValue = UnitsConversionUtil.convert(units, "Mi", - resourceValue); - } - - // special handle gpu - if (key.equals("gpu")) { - key = ResourceInformation.GPU_URI; - } - - // special handle fpga - if (key.equals("fpga")) { - key = ResourceInformation.FPGA_URI; - } - - resources.put(key, resourceValue); - } - return resources; - } - - private static void validateResourceTypes(Iterable resourceNames, - List resourceTypes) throws IOException, YarnException { - for (String resourceName : resourceNames) { - if (!resourceTypes.stream().anyMatch( - e -> e.getName().equals(resourceName))) { - throw new ResourceNotFoundException( - "Unknown resource: " + resourceName); - } - } - } - - public static Resource createResourceFromString(String resourceStr, - List resourceTypes) throws IOException, YarnException { - Map typeToValue = parseResourcesString(resourceStr); - validateResourceTypes(typeToValue.keySet(), resourceTypes); - Resource resource = Resource.newInstance(0, 0); - for (Map.Entry entry : typeToValue.entrySet()) { - resource.setResourceValue(entry.getKey(), entry.getValue()); - } - return resource; - } - // Is it for help? public static boolean argsForHelp(String[] args) { if (args == null || args.length == 0) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-submarine/src/main/java/org/apache/hadoop/yarn/submarine/client/cli/param/RunJobParameters.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-submarine/src/main/java/org/apache/hadoop/yarn/submarine/client/cli/param/RunJobParameters.java index 111d4ebd61a..c66d1e95b58 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-submarine/src/main/java/org/apache/hadoop/yarn/submarine/client/cli/param/RunJobParameters.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-submarine/src/main/java/org/apache/hadoop/yarn/submarine/client/cli/param/RunJobParameters.java @@ -22,6 +22,7 @@ import org.apache.hadoop.yarn.submarine.client.cli.CliConstants; import org.apache.hadoop.yarn.submarine.client.cli.CliUtils; import org.apache.hadoop.yarn.submarine.common.ClientContext; +import org.apache.hadoop.yarn.util.resource.Resources; import java.io.IOException; import java.util.ArrayList; @@ -104,7 +105,7 @@ public void updateParametersByParsedCommandline(CommandLine parsedCommandLine, throw new ParseException( "--" + CliConstants.WORKER_RES + " is absent."); } - workerResource = CliUtils.createResourceFromString( + workerResource = Resources.createResourceFromString( workerResourceStr, clientContext.getOrCreateYarnClient().getResourceTypeInfo()); } @@ -115,7 +116,7 @@ public void updateParametersByParsedCommandline(CommandLine parsedCommandLine, if (psResourceStr == null) { throw new ParseException("--" + CliConstants.PS_RES + " is absent."); } - psResource = CliUtils.createResourceFromString(psResourceStr, + psResource = Resources.createResourceFromString(psResourceStr, clientContext.getOrCreateYarnClient().getResourceTypeInfo()); } @@ -127,7 +128,7 @@ public void updateParametersByParsedCommandline(CommandLine parsedCommandLine, if (tensorboardResourceStr == null || tensorboardResourceStr.isEmpty()) { tensorboardResourceStr = CliConstants.TENSORBOARD_DEFAULT_RESOURCES; } - tensorboardResource = CliUtils.createResourceFromString( + tensorboardResource = Resources.createResourceFromString( tensorboardResourceStr, clientContext.getOrCreateYarnClient().getResourceTypeInfo()); tensorboardDockerImage = parsedCommandLine.getOptionValue( diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-submarine/src/test/java/org/apache/hadoop/yarn/submarine/client/cli/TestRunJobCliParsing.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-submarine/src/test/java/org/apache/hadoop/yarn/submarine/client/cli/TestRunJobCliParsing.java index 184d53d7a01..534706d3123 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-submarine/src/test/java/org/apache/hadoop/yarn/submarine/client/cli/TestRunJobCliParsing.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-submarine/src/test/java/org/apache/hadoop/yarn/submarine/client/cli/TestRunJobCliParsing.java @@ -207,36 +207,36 @@ public void testLaunchCommandPatternReplace() throws Exception { @Test public void testResourceUnitParsing() throws Exception { - Resource res = CliUtils.createResourceFromString("memory=20g,vcores=3", + Resource res = Resources.createResourceFromString("memory=20g,vcores=3", ResourceUtils.getResourcesTypeInfo()); Assert.assertEquals(Resources.createResource(20 * 1024, 3), res); - res = CliUtils.createResourceFromString("memory=20G,vcores=3", + res = Resources.createResourceFromString("memory=20G,vcores=3", ResourceUtils.getResourcesTypeInfo()); Assert.assertEquals(Resources.createResource(20 * 1024, 3), res); - res = CliUtils.createResourceFromString("memory=20M,vcores=3", + res = Resources.createResourceFromString("memory=20M,vcores=3", ResourceUtils.getResourcesTypeInfo()); Assert.assertEquals(Resources.createResource(20, 3), res); - res = CliUtils.createResourceFromString("memory=20m,vcores=3", + res = Resources.createResourceFromString("memory=20m,vcores=3", ResourceUtils.getResourcesTypeInfo()); Assert.assertEquals(Resources.createResource(20, 3), res); - res = CliUtils.createResourceFromString("memory-mb=20,vcores=3", + res = Resources.createResourceFromString("memory-mb=20,vcores=3", ResourceUtils.getResourcesTypeInfo()); Assert.assertEquals(Resources.createResource(20, 3), res); - res = CliUtils.createResourceFromString("memory-mb=20m,vcores=3", + res = Resources.createResourceFromString("memory-mb=20m,vcores=3", ResourceUtils.getResourcesTypeInfo()); Assert.assertEquals(Resources.createResource(20, 3), res); - res = CliUtils.createResourceFromString("memory-mb=20G,vcores=3", + res = Resources.createResourceFromString("memory-mb=20G,vcores=3", ResourceUtils.getResourcesTypeInfo()); Assert.assertEquals(Resources.createResource(20 * 1024, 3), res); // W/o unit for memory means bits, and 20 bits will be rounded to 0 - res = CliUtils.createResourceFromString("memory=20,vcores=3", + res = Resources.createResourceFromString("memory=20,vcores=3", ResourceUtils.getResourcesTypeInfo()); Assert.assertEquals(Resources.createResource(0, 3), res); @@ -245,27 +245,27 @@ public void testResourceUnitParsing() throws Exception { ResourceUtils.getResourcesTypeInfo()); resTypes.add(ResourceTypeInfo.newInstance(ResourceInformation.GPU_URI, "")); ResourceUtils.reinitializeResources(resTypes); - res = CliUtils.createResourceFromString("memory=2G,vcores=3,gpu=0", + res = Resources.createResourceFromString("memory=2G,vcores=3,gpu=0", resTypes); Assert.assertEquals(2 * 1024, res.getMemorySize()); Assert.assertEquals(0, res.getResourceValue(ResourceInformation.GPU_URI)); - res = CliUtils.createResourceFromString("memory=2G,vcores=3,gpu=3", + res = Resources.createResourceFromString("memory=2G,vcores=3,gpu=3", resTypes); Assert.assertEquals(2 * 1024, res.getMemorySize()); Assert.assertEquals(3, res.getResourceValue(ResourceInformation.GPU_URI)); - res = CliUtils.createResourceFromString("memory=2G,vcores=3", + res = Resources.createResourceFromString("memory=2G,vcores=3", resTypes); Assert.assertEquals(2 * 1024, res.getMemorySize()); Assert.assertEquals(0, res.getResourceValue(ResourceInformation.GPU_URI)); - res = CliUtils.createResourceFromString("memory=2G,vcores=3,yarn.io/gpu=0", + res = Resources.createResourceFromString("memory=2G,vcores=3,yarn.io/gpu=0", resTypes); Assert.assertEquals(2 * 1024, res.getMemorySize()); Assert.assertEquals(0, res.getResourceValue(ResourceInformation.GPU_URI)); - res = CliUtils.createResourceFromString("memory=2G,vcores=3,yarn.io/gpu=3", + res = Resources.createResourceFromString("memory=2G,vcores=3,yarn.io/gpu=3", resTypes); Assert.assertEquals(2 * 1024, res.getMemorySize()); Assert.assertEquals(3, res.getResourceValue(ResourceInformation.GPU_URI)); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/Resources.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/Resources.java index 48c2c364ae9..f927e5a7c0c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/Resources.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/Resources.java @@ -25,8 +25,16 @@ import org.apache.hadoop.classification.InterfaceStability.Unstable; import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.api.records.ResourceInformation; +import org.apache.hadoop.yarn.api.records.ResourceTypeInfo; import org.apache.hadoop.yarn.api.records.impl.LightWeightResource; import org.apache.hadoop.yarn.exceptions.ResourceNotFoundException; +import org.apache.hadoop.yarn.exceptions.YarnException; +import org.apache.hadoop.yarn.util.UnitsConversionUtil; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * Resources is a computation class which provides a set of apis to do @@ -39,6 +47,8 @@ private static final Log LOG = LogFactory.getLog(Resources.class); + private final static String RES_PATTERN = "^[^=]+=\\d+\\s?\\w*$"; + /** * Return a new {@link Resource} instance with all resource values * initialized to {@code value}. @@ -58,6 +68,89 @@ public static Resource createResourceWithSameValue(long value) { return res; } + @Private + @Unstable + public static Resource createResourceFromString(String resourceStr, + List resourceTypes) { + Map typeToValue = parseResourcesString(resourceStr); + validateResourceTypes(typeToValue.keySet(), resourceTypes); + Resource resource = Resource.newInstance(0, 0); + for (Map.Entry entry : typeToValue.entrySet()) { + resource.setResourceValue(entry.getKey(), entry.getValue()); + } + return resource; + } + + private static Map parseResourcesString(String resourcesStr) { + Map resources = new HashMap<>(); + String[] pairs = resourcesStr.trim().split(","); + for (String resource : pairs) { + resource = resource.trim(); + if (!resource.matches(RES_PATTERN)) { + throw new IllegalArgumentException("\"" + resource + "\" is not a " + + "valid resource type/amount pair. " + + "Please provide key=amount pairs separated by commas."); + } + String[] splits = resource.split("="); + String key = splits[0], value = splits[1]; + String units = ResourceUtils.getUnits(value); + + String valueWithoutUnit = value.substring(0, + value.length()- units.length()).trim(); + long resourceValue = Long.parseLong(valueWithoutUnit); + + // Convert commandline unit to standard YARN unit. + if (units.equals("M") || units.equals("m")) { + units = "Mi"; + } else if (units.equals("G") || units.equals("g")) { + units = "Gi"; + } else if (units.isEmpty()) { + // do nothing; + } else { + throw new IllegalArgumentException("Acceptable units are M/G or empty"); + } + + // special handle memory-mb and memory + if (key.equals(ResourceInformation.MEMORY_URI)) { + if (!units.isEmpty()) { + resourceValue = UnitsConversionUtil.convert(units, "Mi", + resourceValue); + } + } + + if (key.equals("memory")) { + key = ResourceInformation.MEMORY_URI; + resourceValue = UnitsConversionUtil.convert(units, "Mi", + resourceValue); + } + + // special handle gpu + if (key.equals("gpu")) { + key = ResourceInformation.GPU_URI; + } + + // special handle fpga + if (key.equals("fpga")) { + key = ResourceInformation.FPGA_URI; + } + + resources.put(key, resourceValue); + } + return resources; + } + + private static void validateResourceTypes(Iterable resourceNames, + List resourceTypes) + throws ResourceNotFoundException { + for (String resourceName : resourceNames) { + if (!resourceTypes.stream().anyMatch( + e -> e.getName().equals(resourceName))) { + throw new ResourceNotFoundException( + "Unknown resource: " + resourceName); + } + } + } + /** * Helper class to create a resource with a fixed value for all resource * types. For example, a NONE resource which returns 0 for any resource type. diff --git a/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 b/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 index 08380f5cead..66827df6690 100644 --- a/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 +++ b/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 @@ -19,20 +19,17 @@ package org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Strings; import com.google.common.collect.ImmutableSet; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.curator.shaded.com.google.common.collect.Lists; import org.apache.hadoop.classification.InterfaceAudience.Private; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.security.authorize.AccessControlList; import org.apache.hadoop.util.ReflectionUtils; import org.apache.hadoop.util.StringUtils; -import org.apache.hadoop.yarn.api.records.Priority; -import org.apache.hadoop.yarn.api.records.QueueACL; -import org.apache.hadoop.yarn.api.records.QueueState; -import org.apache.hadoop.yarn.api.records.ReservationACL; -import org.apache.hadoop.yarn.api.records.Resource; -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.nodelabels.CommonNodeLabelsManager; @@ -147,6 +144,9 @@ public static final String MAXIMUM_ALLOCATION_VCORES = "maximum-allocation-vcores"; + @Private + public static final String MAXIMUM_ALLOCATION_QUEUE_DEFAULT = + PREFIX + "default-queue-maximum-allocation"; /** * Ordering policy of queues */ @@ -881,6 +881,14 @@ public void setQueuePriority(String queue, int priority) { public Resource getMaximumAllocationPerQueue(String queue) { // Only support to specify memory and vcores maximum allocation per queue // for now. + Resource clusterMax = ResourceUtils.fetchMaximumAllocationFromConfig(this); + String queueDefaultString = get(MAXIMUM_ALLOCATION_QUEUE_DEFAULT); + Resource queueDefault = Strings.isNullOrEmpty(queueDefaultString) ? + Resource.newInstance(clusterMax.getMemorySize(), clusterMax.getVirtualCores()) : + Resources.createResourceFromString(queueDefaultString, + Lists.newArrayList(ResourceTypeInfo.newInstance(ResourceInformation.MEMORY_URI), + ResourceTypeInfo.newInstance(ResourceInformation.VCORES_URI))); + String queuePrefix = getQueuePrefix(queue); long maxAllocationMbPerQueue = getInt(queuePrefix + MAXIMUM_ALLOCATION_MB, (int)UNDEFINED); @@ -892,14 +900,14 @@ public Resource getMaximumAllocationPerQueue(String queue) { LOG.debug("max alloc vcores per queue for " + queue + " is " + maxAllocationVcoresPerQueue); } - Resource clusterMax = ResourceUtils.fetchMaximumAllocationFromConfig(this); + if (maxAllocationMbPerQueue == (int)UNDEFINED) { LOG.info("max alloc mb per queue for " + queue + " is undefined"); - maxAllocationMbPerQueue = clusterMax.getMemorySize(); + maxAllocationMbPerQueue = queueDefault.getMemorySize(); } if (maxAllocationVcoresPerQueue == (int)UNDEFINED) { LOG.info("max alloc vcore per queue for " + queue + " is undefined"); - maxAllocationVcoresPerQueue = clusterMax.getVirtualCores(); + maxAllocationVcoresPerQueue = queueDefault.getVirtualCores(); } // Copy from clusterMax and overwrite per-queue's maximum memory/vcore // allocation. 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/TestCapacityScheduler.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/TestCapacityScheduler.java index 72e343a9e28..bf95c2464fa 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/TestCapacityScheduler.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/TestCapacityScheduler.java @@ -3210,6 +3210,72 @@ public void testRefreshQueuesMaxAllocationCSLarger() throws Exception { ((LeafQueue) queueB2).getMaximumAllocation().getVirtualCores()); } + @Test + public void testQueuesDefaultMaxAllocation() throws Exception { + // queue level max allocation is set by the queue configuration explicitly, + // from queue-default value, or from the cluster configuration if both + // are missing. + CapacityScheduler cs = new CapacityScheduler(); + cs.setConf(new YarnConfiguration()); + cs.setRMContext(resourceManager.getRMContext()); + CapacitySchedulerConfiguration conf = new CapacitySchedulerConfiguration(); + setupQueueConfiguration(conf); + setMaxAllocMb(conf, + YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_MB); + setMaxAllocVcores(conf, + YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_VCORES); + + conf.set(CapacitySchedulerConfiguration.MAXIMUM_ALLOCATION_QUEUE_DEFAULT, "memory-mb=4096,vcores=2"); + + setMaxAllocMb(conf, A1, 6144); + setMaxAllocVcores(conf, A1, 3); + cs.init(conf); + cs.start(); + cs.reinitialize(conf, mockContext); + checkQueueCapacities(cs, A_CAPACITY, B_CAPACITY); + + assertEquals("max capability MB in CS", + YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_MB, + cs.getMaximumResourceCapability().getMemorySize()); + assertEquals("max capability vcores in CS", + YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_VCORES, + cs.getMaximumResourceCapability().getVirtualCores()); + assertEquals("max allocation MB A1", + 6144, + conf.getMaximumAllocationPerQueue(A1).getMemorySize()); + assertEquals("max allocation vcores A1", + 3, + conf.getMaximumAllocationPerQueue(A1).getVirtualCores()); + assertEquals("max allocation MB A2", 4096, + conf.getMaximumAllocationPerQueue(A2).getMemorySize()); + assertEquals("max allocation vcores A2", + 2, + conf.getMaximumAllocationPerQueue(A2).getVirtualCores()); + + // Unset queues default + conf.unset(CapacitySchedulerConfiguration.MAXIMUM_ALLOCATION_QUEUE_DEFAULT); + cs.reinitialize(conf, mockContext); + + assertEquals("max capability MB in CS", + YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_MB, + cs.getMaximumResourceCapability().getMemorySize()); + assertEquals("max capability vcores in CS", + YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_VCORES, + cs.getMaximumResourceCapability().getVirtualCores()); + assertEquals("max allocation MB A1", + 6144, + conf.getMaximumAllocationPerQueue(A1).getMemorySize()); + assertEquals("max allocation vcores A1", + 3, + conf.getMaximumAllocationPerQueue(A1).getVirtualCores()); + assertEquals("max allocation MB A2", + YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_MB, + conf.getMaximumAllocationPerQueue(A2).getMemorySize()); + assertEquals("max allocation vcores A2", + YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_VCORES, + conf.getMaximumAllocationPerQueue(A2).getVirtualCores()); + } + private void waitContainerAllocated(MockAM am, int mem, int nContainer, int startContainerId, MockRM rm, MockNM nm) throws Exception { for (int cId = startContainerId; cId < startContainerId + nContainer; cId++) {