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 118f9fb9927..443dc90a4a7 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 @@ -3319,6 +3319,12 @@ public static boolean isAclEnabled(Configuration conf) { public static final String NODE_LABELS_ENABLED = NODE_LABELS_PREFIX + "enabled"; public static final boolean DEFAULT_NODE_LABELS_ENABLED = false; + + public static final String PREDEFINED_EXCLUSIVE_NODE_LABELS = + NODE_LABELS_PREFIX + "predefined.exclusive.labels"; + + public static final String PREDEFINED_NONEXCLUSIVE_NODE_LABELS = + NODE_LABELS_PREFIX + "predefined.nonexclusive.labels"; public static final String NODELABEL_CONFIGURATION_TYPE = NODE_LABELS_PREFIX + "configuration-type"; diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/CommonNodeLabelsManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/CommonNodeLabelsManager.java index 66e945fc2ff..1ca0b125e18 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/CommonNodeLabelsManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/CommonNodeLabelsManager.java @@ -279,6 +279,22 @@ protected void serviceStart() throws Exception { } startDispatcher(); + + try { + Collection defaultExclusiveNodeLabels = getConfig(). + getTrimmedStringCollection( + YarnConfiguration.PREDEFINED_EXCLUSIVE_NODE_LABELS); + addToClusterNodeLabels(new HashSet<>(defaultExclusiveNodeLabels), true); + + Collection defaultNonExclusiveNodeLabels = getConfig(). + getTrimmedStringCollection( + YarnConfiguration.PREDEFINED_NONEXCLUSIVE_NODE_LABELS); + addToClusterNodeLabels(new HashSet<>(defaultNonExclusiveNodeLabels), + false); + } catch (IOException ie) { + LOG.error("Failed to setup default node labels.", ie); + throw new YarnRuntimeException(ie); + } } // for UT purpose @@ -344,9 +360,14 @@ public void addToCluserNodeLabels(Collection labels) @VisibleForTesting public void addToCluserNodeLabelsWithDefaultExclusivity(Set labels) throws IOException { + addToClusterNodeLabels(labels, true); + } + + public void addToClusterNodeLabels(Set labels, boolean exclusivity) + throws IOException { Set nodeLabels = new HashSet(); for (String label : labels) { - nodeLabels.add(NodeLabel.newInstance(label)); + nodeLabels.add(NodeLabel.newInstance(label, exclusivity)); } addToCluserNodeLabels(nodeLabels); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/nodelabels/TestCommonNodeLabelsManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/nodelabels/TestCommonNodeLabelsManager.java index 54e331b71b9..709ec790d14 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/nodelabels/TestCommonNodeLabelsManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/nodelabels/TestCommonNodeLabelsManager.java @@ -616,4 +616,28 @@ public void testGetNodeLabelsInfo() throws IOException { toNodeId("n1"), toSet(NodeLabel.newInstance("p2", true)), toNodeId("n2"), toSet(NodeLabel.newInstance("p3", false)))); } + + @Test(timeout = 5000) + public void testDefaultExclusiveNodeLabels() throws IOException { + mgr = new DummyCommonNodeLabelsManager(); + Configuration conf = new YarnConfiguration(); + conf.setBoolean(YarnConfiguration.NODE_LABELS_ENABLED, true); + conf.set(YarnConfiguration.PREDEFINED_EXCLUSIVE_NODE_LABELS, "a,b"); + mgr.init(conf); + mgr.start(); + Assert.assertTrue(mgr.isExclusiveNodeLabel("a")); + Assert.assertTrue(mgr.isExclusiveNodeLabel("b")); + } + + @Test(timeout = 5000) + public void testDefaultNonExclusiveNodeLabels() throws IOException { + mgr = new DummyCommonNodeLabelsManager(); + Configuration conf = new YarnConfiguration(); + conf.setBoolean(YarnConfiguration.NODE_LABELS_ENABLED, true); + conf.set(YarnConfiguration.PREDEFINED_NONEXCLUSIVE_NODE_LABELS, "a,b"); + mgr.init(conf); + mgr.start(); + Assert.assertFalse(mgr.isExclusiveNodeLabel("a")); + Assert.assertFalse(mgr.isExclusiveNodeLabel("b")); + } }