diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ResourceInformation.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ResourceInformation.java index c83c3a22fda..3f2f4ce511b 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ResourceInformation.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ResourceInformation.java @@ -53,7 +53,11 @@ public class ResourceInformation implements Comparable { public static final ResourceInformation FPGAS = ResourceInformation.newInstance(FPGA_URI); - public static final Map MANDATORY_RESOURCES = + /** + * Special resources that should be treated separately + * from arbitrary resource types. + */ + public static final Map SPECIAL_RESOURCES = ImmutableMap.of(MEMORY_URI, MEMORY_MB, VCORES_URI, VCORES, GPU_URI, GPUS, FPGA_URI, FPGAS); /** diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceUtils.java index c2d720147b9..fd8be242fba 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceUtils.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceUtils.java @@ -81,14 +81,28 @@ public class ResourceUtils { private ResourceUtils() { } - private static void checkMandatoryResources( + /** + * Ensures that historical resource types (like {@link + * ResourceInformation#MEMORY_URI}, {@link ResourceInformation#VCORES_URI}) + * are not getting overridden in the resourceInformationMap. + * + * Also checks whether {@link ResourceInformation#SPECIAL_RESOURCES} are not + * configured poorly: having their proper units and types. + * + * @param resourceInformationMap Map object having keys as resources names + * and {@link ResourceInformation} objects as + * values + * @throws YarnRuntimeException if either of the two above + * conditions do not hold + */ + private static void checkSpecialResources( Map resourceInformationMap) throws YarnRuntimeException { /* - * Supporting 'memory', 'memory-mb', 'vcores' also as invalid resource names, in addition to - * 'MEMORY' for historical reasons + * Supporting 'memory', 'memory-mb', 'vcores' also as invalid resource + * names, in addition to 'MEMORY' for historical reasons */ - String keys[] = { "memory", ResourceInformation.MEMORY_URI, + String[] keys = { "memory", ResourceInformation.MEMORY_URI, ResourceInformation.VCORES_URI }; for(String key : keys) { if (resourceInformationMap.containsKey(key)) { @@ -99,7 +113,7 @@ public class ResourceUtils { } for (Map.Entry mandatoryResourceEntry : - ResourceInformation.MANDATORY_RESOURCES.entrySet()) { + ResourceInformation.SPECIAL_RESOURCES.entrySet()) { String key = mandatoryResourceEntry.getKey(); ResourceInformation mandatoryRI = mandatoryResourceEntry.getValue(); @@ -122,6 +136,13 @@ public class ResourceUtils { } } + /** + * Ensures that {@link ResourceUtils#MEMORY} and {@link ResourceUtils#VCORES} + * resources are contained in the map received as parameter. + * + * @param res Map object having keys as resources names + * and {@link ResourceInformation} objects as values + */ private static void addMandatoryResources( Map res) { ResourceInformation ri; @@ -259,7 +280,7 @@ public class ResourceUtils { validateNameOfResourceNameAndThrowException(name); } - checkMandatoryResources(resourceInformationMap); + checkSpecialResources(resourceInformationMap); addMandatoryResources(resourceInformationMap); setAllocationForMandatoryResources(resourceInformationMap, conf); @@ -488,7 +509,7 @@ public class ResourceUtils { if (!initializedNodeResources) { Map nodeResources = initializeNodeResourceInformation( conf); - checkMandatoryResources(nodeResources); + checkSpecialResources(nodeResources); addMandatoryResources(nodeResources); setAllocationForMandatoryResources(nodeResources, conf); readOnlyNodeResources = Collections.unmodifiableMap(nodeResources);