From 5a15c392a1a18c5720dbe630bc07e58268c8e6a7 Mon Sep 17 00:00:00 2001 From: Jonathan Turner Eagles Date: Thu, 26 Sep 2013 19:55:26 +0000 Subject: [PATCH] YARN-819. ResourceManager and NodeManager should check for a minimum allowed version (Robert Parker via jeagles) git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1526660 13f79535-47bb-0310-9956-ffa450edef68 --- hadoop-yarn-project/CHANGES.txt | 3 ++ .../hadoop/yarn/conf/YarnConfiguration.java | 11 ++++ .../src/main/resources/yarn-default.xml | 16 ++++++ .../RegisterNodeManagerRequest.java | 2 + .../RegisterNodeManagerResponse.java | 3 ++ .../pb/RegisterNodeManagerRequestPBImpl.java | 15 ++++++ .../pb/RegisterNodeManagerResponsePBImpl.java | 19 +++++++ .../yarn_server_common_service_protos.proto | 3 +- .../nodemanager/NodeStatusUpdaterImpl.java | 30 +++++++++++ .../nodemanager/TestNodeStatusUpdater.java | 42 ++++++++++++++- .../ResourceTrackerService.java | 31 ++++++++++- .../server/resourcemanager/NodeManager.java | 3 +- .../TestResourceTrackerService.java | 54 +++++++++++++++++++ 13 files changed, 228 insertions(+), 4 deletions(-) diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index 034030ed6c8..e9cef587164 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -36,6 +36,9 @@ Release 2.3.0 - UNRELEASED YARN-353. Add Zookeeper-based store implementation for RMStateStore. (Bikas Saha, Jian He and Karthik Kambatla via hitesh) + YARN-819. ResourceManager and NodeManager should check for a minimum allowed + version (Robert Parker via jeagles) + OPTIMIZATIONS BUG FIXES 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 6bf8428e292..dc5baa1a166 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 @@ -362,6 +362,13 @@ public class YarnConfiguration extends Configuration { public static final long DEFAULT_RM_NMTOKEN_MASTER_KEY_ROLLING_INTERVAL_SECS = 24 * 60 * 60; + + public static final String RM_NODEMANAGER_MINIMUM_VERSION = + RM_PREFIX + "nodemanager.minimum.version"; + + public static final String DEFAULT_RM_NODEMANAGER_MINIMUM_VERSION = + "NONE"; + //////////////////////////////// // Node Manager Configs //////////////////////////////// @@ -460,6 +467,10 @@ public class YarnConfiguration extends Configuration { public static final String NM_LOG_DIRS = NM_PREFIX + "log-dirs"; public static final String DEFAULT_NM_LOG_DIRS = "/tmp/logs"; + public static final String NM_RESOURCEMANAGER_MINIMUM_VERSION = + NM_PREFIX + "resourcemanager.minimum.version"; + public static final String DEFAULT_NM_RESOURCEMANAGER_MINIMUM_VERSION = "NONE"; + /** Interval at which the delayed token removal thread runs */ public static final String RM_DELAYED_DELEGATION_TOKEN_REMOVAL_INTERVAL_MS = RM_PREFIX + "delayed.delegation-token.removal-interval-ms"; 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 65718a9d69c..a77115824d2 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 @@ -358,6 +358,14 @@ 1000 + + The minimum allowed version of a connecting nodemanager. The valid values are + NONE (no version checking), EqualToRM (the nodemanager's version is equal to + or greater than the RM version), or a Version String. + yarn.resourcemanager.nodemanager.minimum.version + NONE + + Enable a set of periodic monitors (specified in yarn.resourcemanager.scheduler.monitor.policies) that affect the @@ -737,6 +745,14 @@ 30 + + The minimum allowed version of a resourcemanager that a nodemanager will connect to. + The valid values are NONE (no version checking), EqualToNM (the resourcemanager's version is + equal to or greater than the NM version), or a Version String. + yarn.nodemanager.resourcemanager.minimum.version + NONE + + Max number of threads in NMClientAsync to process container management events diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/api/protocolrecords/RegisterNodeManagerRequest.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/api/protocolrecords/RegisterNodeManagerRequest.java index ac9ee771b0d..32f44a475ed 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/api/protocolrecords/RegisterNodeManagerRequest.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/api/protocolrecords/RegisterNodeManagerRequest.java @@ -25,8 +25,10 @@ public interface RegisterNodeManagerRequest { NodeId getNodeId(); int getHttpPort(); Resource getResource(); + String getNMVersion(); void setNodeId(NodeId nodeId); void setHttpPort(int port); void setResource(Resource resource); + void setNMVersion(String version); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/api/protocolrecords/RegisterNodeManagerResponse.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/api/protocolrecords/RegisterNodeManagerResponse.java index 8e226299518..b20803fb9cc 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/api/protocolrecords/RegisterNodeManagerResponse.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/api/protocolrecords/RegisterNodeManagerResponse.java @@ -42,4 +42,7 @@ public interface RegisterNodeManagerResponse { void setDiagnosticsMessage(String diagnosticsMessage); + void setRMVersion(String version); + + String getRMVersion(); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/api/protocolrecords/impl/pb/RegisterNodeManagerRequestPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/api/protocolrecords/impl/pb/RegisterNodeManagerRequestPBImpl.java index e0a09975522..b81a5900841 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/api/protocolrecords/impl/pb/RegisterNodeManagerRequestPBImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/api/protocolrecords/impl/pb/RegisterNodeManagerRequestPBImpl.java @@ -139,6 +139,21 @@ public class RegisterNodeManagerRequestPBImpl extends ProtoBase containers = new ConcurrentSkipListMap(); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceTrackerService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceTrackerService.java index ec2d4350427..d29115797e0 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceTrackerService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceTrackerService.java @@ -28,6 +28,7 @@ import org.apache.hadoop.ipc.Server; import org.apache.hadoop.net.Node; import org.apache.hadoop.security.authorize.PolicyProvider; import org.apache.hadoop.service.AbstractService; +import org.apache.hadoop.util.VersionUtil; import org.apache.hadoop.yarn.api.records.NodeId; import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.conf.YarnConfiguration; @@ -55,6 +56,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.security.NMTokenSecretManag import org.apache.hadoop.yarn.server.resourcemanager.security.authorize.RMPolicyProvider; import org.apache.hadoop.yarn.server.utils.YarnServerBuilderUtils; import org.apache.hadoop.yarn.util.RackResolver; +import org.apache.hadoop.yarn.util.YarnVersionInfo; public class ResourceTrackerService extends AbstractService implements ResourceTracker { @@ -73,6 +75,7 @@ public class ResourceTrackerService extends AbstractService implements private long nextHeartBeatInterval; private Server server; private InetSocketAddress resourceTrackerAddress; + private String minimumNodeManagerVersion; private static final NodeHeartbeatResponse resync = recordFactory .newRecordInstance(NodeHeartbeatResponse.class); @@ -99,6 +102,7 @@ public class ResourceTrackerService extends AbstractService implements this.nmLivelinessMonitor = nmLivelinessMonitor; this.containerTokenSecretManager = containerTokenSecretManager; this.nmTokenSecretManager = nmTokenSecretManager; + } @Override @@ -124,7 +128,11 @@ public class ResourceTrackerService extends AbstractService implements minAllocVcores = conf.getInt( YarnConfiguration.RM_SCHEDULER_MINIMUM_ALLOCATION_VCORES, YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_VCORES); - + + minimumNodeManagerVersion = conf.get( + YarnConfiguration.RM_NODEMANAGER_MINIMUM_VERSION, + YarnConfiguration.DEFAULT_RM_NODEMANAGER_MINIMUM_VERSION); + super.serviceInit(conf); } @@ -172,10 +180,30 @@ public class ResourceTrackerService extends AbstractService implements int cmPort = nodeId.getPort(); int httpPort = request.getHttpPort(); Resource capability = request.getResource(); + String nodeManagerVersion = request.getNMVersion(); RegisterNodeManagerResponse response = recordFactory .newRecordInstance(RegisterNodeManagerResponse.class); + if (!minimumNodeManagerVersion.equals("NONE")) { + if (minimumNodeManagerVersion.equals("EqualToRM")) { + minimumNodeManagerVersion = YarnVersionInfo.getVersion(); + } + + if ((nodeManagerVersion == null) || + (VersionUtil.compareVersions(nodeManagerVersion,minimumNodeManagerVersion)) < 0) { + String message = + "Disallowed NodeManager Version " + nodeManagerVersion + + ", is less than the minimum version " + + minimumNodeManagerVersion + " sending SHUTDOWN signal to " + + "NodeManager."; + LOG.info(message); + response.setDiagnosticsMessage(message); + response.setNodeAction(NodeAction.SHUTDOWN); + return response; + } + } + // Check if this node is a 'valid' node if (!this.nodesListManager.isValidNode(host)) { String message = @@ -230,6 +258,7 @@ public class ResourceTrackerService extends AbstractService implements LOG.info(message); response.setNodeAction(NodeAction.NORMAL); response.setRMIdentifier(ResourceManager.getClusterTimeStamp()); + response.setRMVersion(YarnVersionInfo.getVersion()); return response; } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/NodeManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/NodeManager.java index f943101e1cc..7f4d3f01055 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/NodeManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/NodeManager.java @@ -58,6 +58,7 @@ import org.apache.hadoop.yarn.server.api.records.NodeHealthStatus; import org.apache.hadoop.yarn.server.api.records.NodeStatus; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerNode; import org.apache.hadoop.yarn.server.utils.BuilderUtils; +import org.apache.hadoop.yarn.util.YarnVersionInfo; import org.apache.hadoop.yarn.util.resource.Resources; @Private @@ -96,9 +97,9 @@ public class NodeManager implements ContainerManagementProtocol { RegisterNodeManagerRequest request = recordFactory .newRecordInstance(RegisterNodeManagerRequest.class); request.setHttpPort(httpPort); - request.setNodeId(this.nodeId); request.setResource(capability); request.setNodeId(this.nodeId); + request.setNMVersion(YarnVersionInfo.getVersion()); resourceTrackerService.registerNodeManager(request); this.schedulerNode = new FiCaSchedulerNode(rmContext.getRMNodes().get( this.nodeId), false); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceTrackerService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceTrackerService.java index 6026ef9ec52..81e2a81fe8a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceTrackerService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceTrackerService.java @@ -46,6 +46,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.QueueMetrics; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.SchedulerEvent; import org.apache.hadoop.yarn.server.utils.BuilderUtils; import org.apache.hadoop.yarn.util.Records; +import org.apache.hadoop.yarn.util.YarnVersionInfo; import org.junit.After; import org.junit.Test; @@ -248,6 +249,59 @@ public class TestResourceTrackerService { checkDecommissionedNMCount(rm, ++initialMetricCount); } + @Test + public void testNodeRegistrationSuccess() throws Exception { + writeToHostsFile("host2"); + Configuration conf = new Configuration(); + conf.set(YarnConfiguration.RM_NODES_INCLUDE_FILE_PATH, hostFile + .getAbsolutePath()); + rm = new MockRM(conf); + rm.start(); + + ResourceTrackerService resourceTrackerService = rm.getResourceTrackerService(); + RegisterNodeManagerRequest req = Records.newRecord( + RegisterNodeManagerRequest.class); + NodeId nodeId = NodeId.newInstance("host2", 1234); + Resource capability = BuilderUtils.newResource(1024, 1); + req.setResource(capability); + req.setNodeId(nodeId); + req.setHttpPort(1234); + req.setNMVersion(YarnVersionInfo.getVersion()); + // trying to register a invalid node. + RegisterNodeManagerResponse response = resourceTrackerService.registerNodeManager(req); + Assert.assertEquals(NodeAction.NORMAL,response.getNodeAction()); + } + + @Test + public void testNodeRegistrationVersionLessThanRM() throws Exception { + writeToHostsFile("host2"); + Configuration conf = new Configuration(); + conf.set(YarnConfiguration.RM_NODES_INCLUDE_FILE_PATH, hostFile + .getAbsolutePath()); + conf.set(YarnConfiguration.RM_NODEMANAGER_MINIMUM_VERSION,"EqualToRM" ); + rm = new MockRM(conf); + rm.start(); + String nmVersion = "1.9.9"; + + ResourceTrackerService resourceTrackerService = rm.getResourceTrackerService(); + RegisterNodeManagerRequest req = Records.newRecord( + RegisterNodeManagerRequest.class); + NodeId nodeId = NodeId.newInstance("host2", 1234); + Resource capability = BuilderUtils.newResource(1024, 1); + req.setResource(capability); + req.setNodeId(nodeId); + req.setHttpPort(1234); + req.setNMVersion(nmVersion); + // trying to register a invalid node. + RegisterNodeManagerResponse response = resourceTrackerService.registerNodeManager(req); + Assert.assertEquals(NodeAction.SHUTDOWN,response.getNodeAction()); + Assert.assertTrue("Diagnostic message did not contain: 'Disallowed NodeManager " + + "Version "+ nmVersion + ", is less than the minimum version'", + response.getDiagnosticsMessage().contains("Disallowed NodeManager Version " + + nmVersion + ", is less than the minimum version ")); + + } + @Test public void testNodeRegistrationFailure() throws Exception { writeToHostsFile("host1");