diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/QueuePlacementRule.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/QueuePlacementRule.java index b115ecf..8de9cb2 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/QueuePlacementRule.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/QueuePlacementRule.java @@ -272,21 +272,43 @@ public boolean isTerminal() { } /** - * Places all apps in the default queue + * Places apps in the specified default queue. If no default queue is + * specified or if the specified default queue isn't a configured queue, the + * app is placed in root.default queue */ public static class Default extends QueuePlacementRule { + private String defaultQueueName; + + @Override + public void initializeFromXml(Element el) + throws AllocationConfigurationException { + defaultQueueName = el.getAttribute("queue"); + super.initializeFromXml(el); + } + @Override protected String getQueueForApp(String requestedQueue, String user, Groups groups, Map> configuredQueues) { + if (defaultQueueName != null && !defaultQueueName.isEmpty()) { + if (!defaultQueueName.startsWith("root.")) { + defaultQueueName = "root." + defaultQueueName; + } + + if (configuredQueues.get(FSQueueType.LEAF).contains(defaultQueueName) + || configuredQueues.get(FSQueueType.PARENT).contains( + defaultQueueName)) { + return defaultQueueName; + } + } return "root." + YarnConfiguration.DEFAULT_QUEUE_NAME; } - + @Override public boolean isTerminal() { return true; } } - + /** * Rejects all apps */ diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestQueuePlacementPolicy.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestQueuePlacementPolicy.java index 640d771..e20b0c3 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestQueuePlacementPolicy.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestQueuePlacementPolicy.java @@ -134,6 +134,22 @@ public void testTerminals() throws Exception { } @Test + public void testDefaultRuleWithQueueAttribute() throws Exception { + // This test covers the use case where we would like default rule + // to point to a different queue by default rather than root.default + configuredQueues.get(FSQueueType.LEAF).add("root.someDefaultQueue"); + StringBuffer sb = new StringBuffer(); + sb.append(""); + sb.append(" "); + sb.append(" "); + sb.append(""); + + QueuePlacementPolicy policy = parse(sb.toString()); + assertEquals("root.someDefaultQueue", + policy.assignAppToQueue("root.default", "user1")); + } + + @Test public void testNestedUserQueueParsingErrors() { // No nested rule specified in hierarchical user queue StringBuffer sb = new StringBuffer(); @@ -311,6 +327,25 @@ public void testNestedUserQueueSpecificRule() throws Exception { policy.assignAppToQueue("root.parent2", "user2")); } + @Test + public void testNestedUserQueueDefaultRule() throws Exception { + // This test covers the use case where we would like user queues to be + // created under a default parent queue + configuredQueues.get(FSQueueType.PARENT).add("root.parentq"); + StringBuffer sb = new StringBuffer(); + sb.append(""); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(""); + + QueuePlacementPolicy policy = parse(sb.toString()); + assertEquals("root.parentq.user1", + policy.assignAppToQueue("root.default", "user1")); + } + private QueuePlacementPolicy parse(String str) throws Exception { // Read and parse the allocations file. DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/apt/FairScheduler.apt.vm hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/apt/FairScheduler.apt.vm index 02890a1..611c390 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/apt/FairScheduler.apt.vm +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/apt/FairScheduler.apt.vm @@ -310,7 +310,8 @@ Allocation file format to ‘parent’ or by configuring at least one leaf under that queue which makes it a parent. See example allocation for a sample use case. - * default: the app is placed into the queue named "default". + * default: the app is placed into the queue specified in the ‘queue’ attribute of the + default rule. If ‘queue’ attribute is not specified, the app is placed into ‘root.default’ queue. * reject: the app is rejected. @@ -348,7 +349,7 @@ Allocation file format - + ---