diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java index 5e4c826a426..625bfc1d035 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java @@ -210,6 +210,12 @@ private static void addDeprecatedKeys() { public static final boolean DEFAULT_RM_SCHEDULER_USE_PORT_FOR_NODE_NAME = false; + /** Configured scheduler queue placement rules. */ + public static final String QUEUE_PLACEMENT_RULES = YARN_PREFIX + + "scheduler.queue-placement-rules"; + /** UserGroupMappingPlacementRule configuration string. */ + public static final String USER_GROUP_PLACEMENT_RULE = "userGroup"; + /** Enable Resource Manager webapp ui actions */ public static final String RM_WEBAPP_UI_ACTIONS_ENABLED = RM_PREFIX + "webapp.ui-actions.enabled"; diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java index d3186da5b4c..fd524002397 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java @@ -564,15 +564,30 @@ public int getPendingBacklogs() { } private void updatePlacementRules() throws IOException { + // Initialize placement rules + Collection placementRuleStrs = conf.getStringCollection( + YarnConfiguration.QUEUE_PLACEMENT_RULES); List placementRules = new ArrayList<>(); - - // Initialize UserGroupMappingPlacementRule - // TODO, need make this defineable by configuration. - UserGroupMappingPlacementRule ugRule = getUserGroupMappingPlacementRule(); - if (null != ugRule) { - placementRules.add(ugRule); + if (placementRuleStrs.isEmpty()) { + PlacementRule ugRule = getUserGroupMappingPlacementRule(); + if (null != ugRule) { + placementRules.add(ugRule); + } + } else { + for (String placementRuleStr : placementRuleStrs) { + switch (placementRuleStr) { + case YarnConfiguration.USER_GROUP_PLACEMENT_RULE: + PlacementRule ugRule = getUserGroupMappingPlacementRule(); + if (null != ugRule) { + placementRules.add(ugRule); + } + break; + default: + throw new IOException("Invalid queue placement rule: " + + placementRuleStr); + } + } } - rmContext.getQueuePlacementManager().updateRules(placementRules); }