diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/RMAdminCLI.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/RMAdminCLI.java index 65978c7..75ce8ed 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/RMAdminCLI.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/RMAdminCLI.java @@ -28,6 +28,8 @@ import java.util.Map; import java.util.Set; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.hadoop.classification.InterfaceAudience.Private; import org.apache.hadoop.classification.InterfaceStability.Unstable; import org.apache.hadoop.conf.Configuration; @@ -68,6 +70,7 @@ RecordFactoryProvider.getRecordFactory(null); private boolean directlyAccessNodeLabelStore = false; static CommonNodeLabelsManager localNodeLabelsManager = null; + private static Log LOG = LogFactory.getLog(RMAdminCLI.class); protected final static Map ADMIN_USAGE = ImmutableMap.builder() @@ -333,6 +336,8 @@ private int getGroups(String[] usernames) throws IOException { private int addToClusterNodeLabels(String args) throws IOException, YarnException { + printWarnLogWhenMemoryRMNodeLabelsManagerIsEnabled(); + Set labels = new HashSet(); for (String p : args.split(",")) { labels.add(p); @@ -357,6 +362,8 @@ private int addToClusterNodeLabels(Set labels) throws IOException, private int removeFromClusterNodeLabels(String args) throws IOException, YarnException { + printWarnLogWhenMemoryRMNodeLabelsManagerIsEnabled(); + Set labels = new HashSet(); for (String p : args.split(",")) { labels.add(p); @@ -419,6 +426,7 @@ private int removeFromClusterNodeLabels(String args) throws IOException, private int replaceLabelsOnNodes(String args) throws IOException, YarnException { + printWarnLogWhenMemoryRMNodeLabelsManagerIsEnabled(); Map> map = buildNodeLabelsFromStr(args); return replaceLabelsOnNodes(map); } @@ -617,6 +625,26 @@ protected HAServiceTarget resolveTarget(String rmId) { "Could not connect to RM HA Admin for node " + rmId); } } + + private void printWarnLogWhenMemoryRMNodeLabelsManagerIsEnabled() { + String nodeLabelsManagerCls = + getConf().get(YarnConfiguration.RM_NODE_LABELS_MANAGER_CLASS); + // The best way is to use MemoryRMNodeLabelsManager.class.getName(), but + // MemoryRMNodeLabelsManager is located in yarn.sever.resourcemanager, so + // just compare the name here + if (nodeLabelsManagerCls == null + || nodeLabelsManagerCls.contains("MemoryRMNodeLabelsManager")) { + final String message = + "Trying to modify node labels, but MemoryRMNodeLabelsManager" + + " is used, all node labels and mappings " + + "will be lost across RM restart. Please note that, " + + "this message is based on the yarn-site.xml settings " + + "in the machine you run \"yarn rmadmin ...\", if you " + + "already edited the field in yarn-site.xml of the node " + + "running RM, please ignore this message."; + LOG.warn(message); + } + } public static void main(String[] args) throws Exception { int result = ToolRunner.run(new RMAdminCLI(), args); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/nodelabels/RMNodeLabelsManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/nodelabels/RMNodeLabelsManager.java index ba1727c..f01f6cf 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/nodelabels/RMNodeLabelsManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/nodelabels/RMNodeLabelsManager.java @@ -67,7 +67,9 @@ protected void serviceInit(Configuration conf) throws Exception { @Override public void addLabelsToNode(Map> addedLabelsToNode) - throws IOException { + throws IOException { + printWarnLogWhenMemoryRMNodeLabelsManagerIsEnabled(); + try { writeLock.lock(); @@ -105,10 +107,24 @@ protected void checkRemoveFromClusterNodeLabelsOfQueue( } } } + + @Override + public void addToCluserNodeLabels(Set labelsToAdd) throws IOException { + printWarnLogWhenMemoryRMNodeLabelsManagerIsEnabled(); + + try { + writeLock.lock(); + super.addToCluserNodeLabels(labelsToAdd); + } finally { + writeLock.unlock(); + } + } @Override public void removeFromClusterNodeLabels(Collection labelsToRemove) throws IOException { + printWarnLogWhenMemoryRMNodeLabelsManagerIsEnabled(); + try { writeLock.lock(); @@ -129,6 +145,8 @@ public void removeFromClusterNodeLabels(Collection labelsToRemove) public void removeLabelsFromNode(Map> removeLabelsFromNode) throws IOException { + printWarnLogWhenMemoryRMNodeLabelsManagerIsEnabled(); + try { writeLock.lock(); @@ -151,6 +169,8 @@ public void removeFromClusterNodeLabels(Collection labelsToRemove) @Override public void replaceLabelsOnNode(Map> replaceLabelsToNode) throws IOException { + printWarnLogWhenMemoryRMNodeLabelsManagerIsEnabled(); + try { writeLock.lock(); @@ -443,6 +463,17 @@ private boolean isNodeUsableByQueue(Set nodeLabels, Queue q) { } return cloneNodeMap(nodesToCopy); } + + private void printWarnLogWhenMemoryRMNodeLabelsManagerIsEnabled() { + if (this instanceof MemoryRMNodeLabelsManager) { + final String message = + "Trying to modify node labels, but " + + MemoryRMNodeLabelsManager.class.getName() + + " is enabled, all node labels and mappings " + + "will be lost across RM restart."; + LOG.warn(message); + } + } public boolean checkAccess(UserGroupInformation user) { // make sure only admin can invoke