diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/resource/TestResourceUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/resource/TestResourceUtils.java index c96982df772..fefffbf6480 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/resource/TestResourceUtils.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/resource/TestResourceUtils.java @@ -71,6 +71,13 @@ public static void addNewTypesToResources(String... resourceTypes) { ResourceUtils.initializeResourcesFromResourceInformationMap(riMap); } + public static void resetResourceTypes() { + Map riMap = new HashMap<>(); + riMap.put(ResourceInformation.MEMORY_URI, ResourceInformation.MEMORY_MB); + riMap.put(ResourceInformation.VCORES_URI, ResourceInformation.VCORES); + ResourceUtils.initializeResourcesFromResourceInformationMap(riMap); + } + @Before public void setup() { ResourceUtils.resetResourceTypes(); 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 282367edbaa..eb4f51c0a53 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 @@ -149,11 +149,6 @@ private static final Log STATE_DUMP_LOG = LogFactory.getLog(FairScheduler.class.getName() + ".statedump"); - private static final ResourceCalculator RESOURCE_CALCULATOR = - new DefaultResourceCalculator(); - private static final ResourceCalculator DOMINANT_RESOURCE_CALCULATOR = - new DominantResourceCalculator(); - // Value that container assignment methods return when a container is // reserved public static final Resource CONTAINER_RESERVED = Resources.createResource(-1); @@ -208,6 +203,8 @@ @VisibleForTesting Resource reservationThreshold; + private ResourceCalculator resourceCalculator; + public FairScheduler() { super(FairScheduler.class.getName()); context = new FSContext(this); @@ -846,7 +843,7 @@ private void removeNode(RMNode rmNode) { public Resource getNormalizedResource(Resource requestedResource, Resource maxResourceCapability) { return SchedulerUtils.getNormalizedResource(requestedResource, - DOMINANT_RESOURCE_CALCULATOR, + resourceCalculator, minimumAllocation, maxResourceCapability, incrAllocation); @@ -1079,7 +1076,7 @@ void continuousSchedulingAttempt() throws InterruptedException { @Override public int compare(FSSchedulerNode n1, FSSchedulerNode n2) { - return RESOURCE_CALCULATOR.compare(getClusterResource(), + return resourceCalculator.compare(getClusterResource(), n2.getUnallocatedResource(), n1.getUnallocatedResource()); } @@ -1193,7 +1190,7 @@ public FSAppAttempt getSchedulerApp(ApplicationAttemptId appAttemptId) { @Override public ResourceCalculator getResourceCalculator() { - return RESOURCE_CALCULATOR; + return resourceCalculator; } /** @@ -1451,6 +1448,7 @@ private void initScheduler(Configuration conf) throws IOException { } catch (Exception e) { throw new IOException("Failed to start FairScheduler", e); } + this.resourceCalculator = new DominantResourceCalculator(); if (continuousSchedulingEnabled) { // Continuous scheduling is deprecated log it on startup 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 1a6069379a9..35384dc120c 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,35 @@ package org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair; +import static org.apache.hadoop.yarn.conf.YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_VCORES; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import javax.xml.parsers.ParserConfigurationException; + import com.google.common.collect.Lists; import com.google.common.collect.Sets; import org.apache.hadoop.conf.Configuration; @@ -88,15 +117,22 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.QueuePlacementRule.Default; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.policies.DominantResourceFairnessPolicy; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.policies.FifoPolicy; +import org.apache.hadoop.yarn.server.resourcemanager.webapp.fairscheduler.CustomResourceTypesConfigurationProvider; import org.apache.hadoop.yarn.server.utils.BuilderUtils; import org.apache.hadoop.yarn.util.ControlledClock; +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.apache.hadoop.yarn.util.resource.TestResourceUtils; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; +import org.mockito.internal.matchers.InstanceOf; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.xml.sax.SAXException; import javax.xml.parsers.ParserConfigurationException; @@ -125,6 +161,7 @@ import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import com.google.common.collect.Sets; @SuppressWarnings("unchecked") public class TestFairScheduler extends FairSchedulerTestBase { @@ -160,8 +197,30 @@ public void tearDown() { QueueMetrics.clearQueueMetrics(); DefaultMetricsSystem.shutdown(); YarnAuthorizationProvider.destroy(); + CustomResourceTypesConfigurationProvider.reset(); + TestResourceUtils.resetResourceTypes(); + } + + @Test + public void testResourceCalculatorIsDominantIfCustomResourceIsNotDefined() { + scheduler.init(conf); + scheduler.start(); + + assertThat(scheduler.getResourceCalculator(), + new InstanceOf(DominantResourceCalculator.class)); } + @Test + public void testResourceCalculatorIsDominantIfCustomResourceIsDefined() { + TestResourceUtils.addNewTypesToResources("customResource1", + "customResource2", "customResource3"); + + scheduler.init(conf); + scheduler.start(); + + assertThat(scheduler.getResourceCalculator(), + new InstanceOf(DominantResourceCalculator.class)); + } @Test (timeout = 30000) public void testConfValidation() throws Exception { @@ -3813,7 +3872,7 @@ public void testMultipleCompletedEvent() throws Exception { .createAbnormalContainerStatus(container.getContainerId(), SchedulerUtils.COMPLETED_APPLICATION), RMContainerEventType.FINISHED); - assertEquals(Resources.none(), app1.getResourceUsage()); + assertEquals(Resource.newInstance(Resources.none()), app1.getResourceUsage()); } @Test