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/fair/FairScheduler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java index 20d1afe0b6b..61c901cbe99 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java @@ -94,6 +94,7 @@ import org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator; import org.apache.hadoop.yarn.util.resource.DominantResourceCalculator; import org.apache.hadoop.yarn.util.resource.ResourceCalculator; +import org.apache.hadoop.yarn.util.resource.ResourceUtils; import org.apache.hadoop.yarn.util.resource.Resources; import java.io.IOException; @@ -1417,7 +1418,7 @@ private void initScheduler(Configuration conf) throws IOException { } if (continuousSchedulingEnabled) { - // Contiuous scheduling is deprecated log it on startup + // Continuous scheduling is deprecated log it on startup LOG.warn("Continuous scheduling is turned ON. It is deprecated " + "because it can cause scheduler slowness due to locking issues. " + "Schedulers should use assignmultiple as a replacement."); @@ -1530,6 +1531,12 @@ public void reinitialize(Configuration conf, RMContext rmContext) } catch (Exception e) { LOG.error("Failed to reload allocations file", e); } + try { + refreshMaximumAllocation( + ResourceUtils.fetchMaximumAllocationFromConfig(conf)); + } catch (Exception e) { + LOG.error("Failed to refresh maximum allocation", e); + } } @Override 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/fair/TestFairScheduler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java index 9120d3a6cc1..c2323b5c7db 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java @@ -18,6 +18,9 @@ package org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair; +import static org.apache.hadoop.yarn.util.resource.ResourceUtils + .MAXIMUM_ALLOCATION; +import static org.apache.hadoop.yarn.util.resource.ResourceUtils.UNITS; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; @@ -28,9 +31,11 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.io.InputStream; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; @@ -53,6 +58,7 @@ import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem; import org.apache.hadoop.net.NetworkTopology; import org.apache.hadoop.security.GroupMappingServiceProvider; +import org.apache.hadoop.yarn.LocalConfigurationProvider; import org.apache.hadoop.yarn.MockApps; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.api.records.ApplicationId; @@ -100,8 +106,6 @@ import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode; import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNodeResourceUpdateEvent; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.AbstractYarnScheduler; - - import org.apache.hadoop.yarn.server.resourcemanager.scheduler.QueueMetrics; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerApplicationAttempt; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerNode; @@ -136,6 +140,45 @@ private final static String ALLOC_FILE = new File(TEST_DIR, "test-queues").getAbsolutePath(); + private static final String A_CUSTOM_RESOURCE = "a-custom-resource"; + + private static class CustomResourceTypesConfigurationProvider + extends LocalConfigurationProvider { + + @Override + public InputStream getConfigurationInputStream(Configuration bootstrapConf, + String name) throws YarnException, IOException { + if (YarnConfiguration.RESOURCE_TYPES_CONFIGURATION_FILE.equals(name)) { + return new ByteArrayInputStream(( + "\n" + + " \n" + + " yarn.resource-types\n" + + " " + A_CUSTOM_RESOURCE + "\n" + + " \n" + + " \n" + + " yarn.resource-types.a-custom-resource.units\n" + + " k\n" + + " \n" + + " \n" + + " yarn.resource-types.a-custom-resource.maximum-allocation\n" + + " 10000\n" + + " \n" + + "\n") + .getBytes()); + } else { + return super.getConfigurationInputStream(bootstrapConf, name); + } + } + } + + private Configuration initResourceTypes() { + Configuration conf = new Configuration(); + conf.set(YarnConfiguration.RM_CONFIGURATION_PROVIDER_CLASS, + TestFairScheduler.CustomResourceTypesConfigurationProvider.class.getName()); + ResourceUtils.resetResourceTypes(conf); + return conf; + } + @Before public void setUp() throws IOException { scheduler = new FairScheduler(); @@ -274,7 +317,34 @@ public void testMinZeroResourcesSettings() throws IOException { Assert.assertEquals(0, scheduler.getMinimumResourceCapability().getVirtualCores()); Assert.assertEquals(512, scheduler.getIncrementResourceCapability().getMemorySize()); Assert.assertEquals(2, scheduler.getIncrementResourceCapability().getVirtualCores()); - } + } + + @Test + public void testMaximumAllocationRefresh() throws IOException { + Configuration conf = initResourceTypes(); + scheduler.init(conf); + scheduler.reinitialize(conf, null); + + Resource maxAllowedAllocation = scheduler.getNodeTracker() + .getMaxAllowedAllocation(); + ResourceInformation customResource = maxAllowedAllocation + .getResourceInformation(A_CUSTOM_RESOURCE); + Assert.assertEquals(10000, customResource.getValue()); + + conf = new YarnConfiguration(); + conf.set(YarnConfiguration.RESOURCE_TYPES, A_CUSTOM_RESOURCE); + conf.set(YarnConfiguration.RESOURCE_TYPES + "." + A_CUSTOM_RESOURCE + + UNITS, "k"); + conf.setInt(YarnConfiguration.RESOURCE_TYPES + "." + A_CUSTOM_RESOURCE + + MAXIMUM_ALLOCATION, 20000); + scheduler.reinitialize(conf, null); + + maxAllowedAllocation = scheduler.getNodeTracker() + .getMaxAllowedAllocation(); + customResource = maxAllowedAllocation + .getResourceInformation(A_CUSTOM_RESOURCE); + Assert.assertEquals(20000, customResource.getValue()); + } @Test public void testAggregateCapacityTracking() throws Exception {