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 5bae2b375f1..1429951845c 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 @@ -2354,7 +2354,18 @@ public void setAutoCreatedLeafQueueTemplateCapacityByLabel(String queuePath, .append("[" + AbsoluteResourceType.MEMORY.toString().toLowerCase() + "=" + resource.getMemorySize() + "," + AbsoluteResourceType.VCORES.toString().toLowerCase() + "=" - + resource.getVirtualCores() + "]"); + + resource.getVirtualCores()); + + if (ResourceUtils.getNumberOfKnownResourceTypes() > 2) { + ResourceInformation[] resources = + resource.getResources(); + for (int i = 2; i < resources.length; i++) { + ResourceInformation resInfo = resources[i]; + resourceString.append("," + + resInfo.getName() + "=" + resInfo.getValue()); + } + } + resourceString.append("]"); setCapacityByLabel(leafQueueConfPrefix, label, resourceString.toString()); } @@ -2389,7 +2400,18 @@ public void setAutoCreatedLeafQueueTemplateMaxCapacity(String queuePath, .append("[" + AbsoluteResourceType.MEMORY.toString().toLowerCase() + "=" + resource.getMemorySize() + "," + AbsoluteResourceType.VCORES.toString().toLowerCase() + "=" - + resource.getVirtualCores() + "]"); + + resource.getVirtualCores()); + + if (ResourceUtils.getNumberOfKnownResourceTypes() > 2) { + ResourceInformation[] resources = + resource.getResources(); + for (int i = 2; i < resources.length; i++) { + ResourceInformation resInfo = resources[i]; + resourceString.append("," + + resInfo.getName() + "=" + resInfo.getValue()); + } + } + resourceString.append("]"); setMaximumCapacityByLabel(leafQueueConfPrefix, label, resourceString.toString()); } @@ -2490,10 +2512,23 @@ private void updateMinMaxResourceToConf(String label, String queue, StringBuilder resourceString = new StringBuilder(); resourceString - .append("[" + AbsoluteResourceType.MEMORY.toString().toLowerCase() + "=" + .append("[" + AbsoluteResourceType. + MEMORY.toString().toLowerCase() + "=" + resource.getMemorySize() + "," + AbsoluteResourceType.VCORES.toString().toLowerCase() + "=" - + resource.getVirtualCores() + "]"); + + resource.getVirtualCores()); + + if (ResourceUtils.getNumberOfKnownResourceTypes() > 2) { + ResourceInformation[] resources = + resource.getResources(); + for (int i = 2; i < resources.length; i++) { + ResourceInformation resInfo = resources[i]; + resourceString.append("," + + resInfo.getName() + "=" + resInfo.getValue()); + } + } + + resourceString.append("]"); String prefix = getQueuePrefix(queue) + type; if (!label.isEmpty()) { @@ -2568,7 +2603,9 @@ private void updateResourceValuesFromConfig(Set resourceTypes, Resource resource, String[] splits) { // If key is not a valid type, skip it. - if (!resourceTypes.contains(splits[0])) { + if (!resourceTypes.contains(splits[0]) + && !ResourceUtils.getResourceTypes().containsKey(splits[0])) { + LOG.error(splits[0] + " not supported."); return; } @@ -2581,6 +2618,14 @@ private void updateResourceValuesFromConfig(Set resourceTypes, resourceValue = UnitsConversionUtil.convert(units, "Mi", resourceValue); } + // Custom resource type defined by user. + // Such as GPU FPGA etc. + if (!resourceTypes.contains(splits[0])) { + resource.setResourceInformation(splits[0].trim(), ResourceInformation + .newInstance(splits[0].trim(), units, resourceValue)); + return; + } + // map it based on key. AbsoluteResourceType resType = AbsoluteResourceType .valueOf(StringUtils.toUpperCase(splits[0].trim())); 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/TestCSAllocateCustomResource.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/TestCSAllocateCustomResource.java index d6f15446441..64431e1066a 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/TestCSAllocateCustomResource.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/TestCSAllocateCustomResource.java @@ -53,6 +53,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; +import java.util.HashSet; +import java.util.Arrays; import static org.apache.hadoop.yarn.api.records.ResourceInformation.GPU_URI; import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerConfiguration.MAXIMUM_ALLOCATION_MB; @@ -246,4 +249,70 @@ public void testClusterMetricsWithGPU() metrics.getCapabilityGPUs(), 0); ClusterMetrics.destroy(); } + + /** + * Test CS absolute conf with Custom resource type. + * */ + @Test + public void testCapacitySchedulerAbsoluteConfWithCustomResourceType() + throws IOException { + // reset resource types + ResourceUtils.resetResourceTypes(); + String resourceTypesFileName = "resource-types-test.xml"; + File source = new File( + conf.getClassLoader().getResource(resourceTypesFileName).getFile()); + resourceTypesFile = new File(source.getParent(), "resource-types.xml"); + FileUtils.copyFile(source, resourceTypesFile); + + CapacitySchedulerConfiguration newConf = + new CapacitySchedulerConfiguration(conf); + + + // Only memory vcores for first class. + Set resourceTypes = new HashSet<>( + Arrays.asList("memory", "vcores")); + + Resource aMINRES = ResourceUtils. + createResourceFromString("memory=1000m,vcores=10," + + "yarn.io/gpu=10,yarn.io/fpga=10,testType=10", + ResourceUtils.getResourcesTypeInfo()); + Resource aMAXRES = ResourceUtils. + createResourceFromString("memory=10000m,vcores=100," + + "yarn.io/gpu=100,yarn.io/fpga=100,testType=10", + ResourceUtils.getResourcesTypeInfo()); + + // Define top-level queues + newConf.setQueues(CapacitySchedulerConfiguration.ROOT, + new String[] {"a", "b", "c"}); + newConf.setMinimumResourceRequirement("", "root.a", + aMINRES); + newConf.setMaximumResourceRequirement("", "root.a", + aMAXRES); + + newConf.setClass(CapacitySchedulerConfiguration.RESOURCE_CALCULATOR_CLASS, + DominantResourceCalculator.class, ResourceCalculator.class); + + //start RM + MockRM rm = new MockRM(newConf); + rm.start(); + + // Check the gpu resource conf is right. + CapacityScheduler cs = (CapacityScheduler) rm.getResourceScheduler(); + Assert.assertEquals(aMINRES, + cs.getConfiguration(). + getMinimumResourceRequirement("", "root.a", resourceTypes)); + Assert.assertEquals(aMAXRES, + cs.getConfiguration(). + getMaximumResourceRequirement("", "root.a", resourceTypes)); + + // Check the gpu resource of queue is right. + Assert.assertEquals(aMINRES, cs.getQueue("root.a"). + getQueueResourceQuotas().getConfiguredMinResource()); + Assert.assertEquals(aMAXRES, cs.getQueue("root.a"). + getQueueResourceQuotas().getConfiguredMaxResource()); + + rm.close(); + + } + } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/resources/resource-types-test.xml b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/resources/resource-types-test.xml index be4f07428c5..2ae7531172b 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/resources/resource-types-test.xml +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/resources/resource-types-test.xml @@ -17,6 +17,6 @@ yarn.resource-types - yarn.io/gpu, yarn.io/fpga + yarn.io/gpu, yarn.io/fpga, testType \ No newline at end of file