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 41755e2c27e..c4612288f89 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 @@ -3387,6 +3387,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..22c6d1ce8a1 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,24 @@ protected void serviceStart() throws Exception { } startDispatcher(); + + if (nodeLabelsEnabled) { + 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 +362,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/main/resources/yarn-default.xml b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml index 81b6658d61e..4dea954ecc0 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml @@ -2772,6 +2772,23 @@ centralized + + + Default exclusive node labels. Administrators can specify comma separated + list of default exclusive node labels. + + yarn.node-labels.predefined.exclusive.labels + + + + + + Default non exclusive node labels. Administrators can specify comma + separated list of default non exclusive node labels. + + yarn.node-labels.predefined.nonexclusive.labels + + 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")); + } }