diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java index 63031df21fa..ba02f17f595 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java @@ -274,6 +274,10 @@ private static void addDeprecatedKeys() { public static final boolean DEFAULT_RM_SCHEDULER_USE_PORT_FOR_NODE_NAME = false; + /** Configure default application placement allocator. */ + public static final String ENV_APPLICATION_PLACEMENT_TYPE_CLASS_DEFAULT = + YARN_PREFIX + "scheduler.app-placement-allocator.class"; + /** Configured scheduler queue placement rules. */ public static final String QUEUE_PLACEMENT_RULES = YARN_PREFIX + "scheduler.queue-placement-rules"; 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/AppSchedulingInfo.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AppSchedulingInfo.java index 02bf3767811..0225afe5022 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AppSchedulingInfo.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AppSchedulingInfo.java @@ -37,6 +37,7 @@ import org.slf4j.LoggerFactory; import org.apache.hadoop.classification.InterfaceAudience.Private; import org.apache.hadoop.classification.InterfaceStability.Unstable; +import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.Container; @@ -104,6 +105,8 @@ private final RMContext rmContext; private final int retryAttempts; + private final String defaultResourceRequestAppPlacementType; + public AppSchedulingInfo(ApplicationAttemptId appAttemptId, String user, Queue queue, AbstractUsersManager abstractUsersManager, long epoch, ResourceUsage appResourceUsage, @@ -126,8 +129,30 @@ public AppSchedulingInfo(ApplicationAttemptId appAttemptId, String user, updateContext = new ContainerUpdateContext(this); readLock = lock.readLock(); writeLock = lock.writeLock(); + + this.defaultResourceRequestAppPlacementType = + getDefaultResourceRequestAppPlacementType(); } + /** + * Update set default App Placement Allocator. + */ + public String getDefaultResourceRequestAppPlacementType() { + if (this.rmContext != null + && this.rmContext.getYarnConfiguration() != null) { + + String appPlacementClass = applicationSchedulingEnvs.get( + ApplicationSchedulingConfig.ENV_APPLICATION_PLACEMENT_TYPE_CLASS); + if (null != appPlacementClass) { + return appPlacementClass; + } else { + Configuration conf = rmContext.getYarnConfiguration(); + return conf.get( + YarnConfiguration.ENV_APPLICATION_PLACEMENT_TYPE_CLASS_DEFAULT); + } + } + return null; + } public ApplicationId getApplicationId() { return applicationId; } @@ -320,8 +345,7 @@ private boolean internalAddResourceRequests( SchedulerRequestKey schedulerRequestKey = entry.getKey(); AppPlacementAllocator appPlacementAllocator = getAndAddAppPlacementAllocatorIfNotExist(schedulerRequestKey, - applicationSchedulingEnvs.get( - ApplicationSchedulingConfig.ENV_APPLICATION_PLACEMENT_TYPE_CLASS)); + defaultResourceRequestAppPlacementType); // Update AppPlacementAllocator PendingAskUpdateResult pendingAmountChanges = 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/TestAppSchedulingInfo.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestAppSchedulingInfo.java index 62e5f3d72ab..4f25cf8d18f 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestAppSchedulingInfo.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestAppSchedulingInfo.java @@ -20,9 +20,11 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import java.util.*; +import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.Priority; @@ -175,4 +177,40 @@ public void testSchedulerKeyAccounting() { info.updateResourceRequests(reqs, false); Assert.assertEquals(0, info.getSchedulerKeys().size()); } + + @Test + public void testDefaultResourceRequestAppPlacementType() { + + String DEFAULT_APPLICATION_PLACEMENT_TYPE_CLASS = "org.apache.hadoop.yarn." + + "server.resourcemanager.scheduler.capacity." + + "yarnpp.YarnppLocalityAppPlacementAllocator"; + Configuration conf = new Configuration(); + RMContext rmContext = mock(RMContext.class); + when(rmContext.getYarnConfiguration()).thenReturn(conf); + + ApplicationId appIdImpl = ApplicationId.newInstance(0, 1); + ApplicationAttemptId appAttemptId = + ApplicationAttemptId.newInstance(appIdImpl, 1); + Queue queue = mock(Queue.class); + + AppSchedulingInfo info = new AppSchedulingInfo( + appAttemptId, "test", queue, mock(ActiveUsersManager.class), 0, + new ResourceUsage(), new HashMap<>(),rmContext); + + Assert.assertEquals(info.getApplicationSchedulingEnvs(), new HashMap<>()); + + // This should return null as nothing is set in the conf. + Assert.assertNull(info.getDefaultResourceRequestAppPlacementType()); + + conf = new Configuration(); + conf.set(YarnConfiguration.ENV_APPLICATION_PLACEMENT_TYPE_CLASS_DEFAULT, + DEFAULT_APPLICATION_PLACEMENT_TYPE_CLASS); + when(rmContext.getYarnConfiguration()).thenReturn(conf); + info = new AppSchedulingInfo( + appAttemptId, "test", queue, mock(ActiveUsersManager.class), 0, + new ResourceUsage(), new HashMap<>(),rmContext); + + Assert.assertEquals(info.getDefaultResourceRequestAppPlacementType(), + DEFAULT_APPLICATION_PLACEMENT_TYPE_CLASS); + } }