.../org/apache/hadoop/net/ServerSocketUtil.java | 52 ++++++++++++++++++++++ .../nodemanager/TestNodeManagerShutdown.java | 26 +++++++---- .../containermanager/BaseContainerManagerTest.java | 5 +-- 3 files changed, 72 insertions(+), 11 deletions(-) diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/net/ServerSocketUtil.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/net/ServerSocketUtil.java new file mode 100644 index 0000000..9566eb7 --- /dev/null +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/net/ServerSocketUtil.java @@ -0,0 +1,52 @@ +package org.apache.hadoop.net; + +import java.io.IOException; +import java.net.ServerSocket; +import java.util.Random; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class ServerSocketUtil { + + private static final Log LOG = LogFactory.getLog(ServerSocketUtil.class); + + /** + * Port scan & allocate is how most other apps find ports + * + * @param port + * given port + * @param retries + * number of retires + * @return + * @throws IOException + */ + public static int getPort(int port, int retries) throws IOException { + Random rand = new Random(); + int givenPort = port; + int tries = 0; + try (ServerSocket s = new ServerSocket(givenPort)) { + LOG.info("Using port " + givenPort); + return givenPort; + } catch (IOException e) { + while (true) { + int tryPort = port + rand.nextInt(65535 - 49152); + try (ServerSocket s = new ServerSocket(tryPort)) { + LOG.info("Using port " + tryPort); + port = tryPort; + return port; + } catch (IOException ioe) { + tries++; + if (tries >= retries) { + LOG.error("Port is already in use; giving up"); + throw ioe; + } else { + LOG.warn("Port is already in use; trying again"); + } + } + } + } + + } + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestNodeManagerShutdown.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestNodeManagerShutdown.java index 2a887ba..efd7053 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestNodeManagerShutdown.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestNodeManagerShutdown.java @@ -33,10 +33,10 @@ import java.util.Map; import org.junit.Assert; - import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileContext; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.net.ServerSocketUtil; import org.apache.hadoop.fs.UnsupportedFileSystemException; import org.apache.hadoop.net.NetUtils; import org.apache.hadoop.security.UserGroupInformation; @@ -195,7 +195,7 @@ public static void startContainer(NodeManager nm, ContainerId cId, recordFactory.newRecordInstance(ContainerLaunchContext.class); NodeId nodeId = BuilderUtils.newNodeId(InetAddress.getByName("localhost") - .getCanonicalHostName(), 12345); + .getCanonicalHostName(), ServerSocketUtil.getPort(49152,10)); URL localResourceUri = ConverterUtils.getYarnUrlFromPath(localFS @@ -215,7 +215,8 @@ public static void startContainer(NodeManager nm, ContainerId cId, List commands = Arrays.asList(Shell.getRunScriptCommand(scriptFile)); containerLaunchContext.setCommands(commands); final InetSocketAddress containerManagerBindAddress = - NetUtils.createSocketAddrForHost("127.0.0.1", 12345); + NetUtils.createSocketAddrForHost("127.0.0.1", + ServerSocketUtil.getPort(49152,10)); UserGroupInformation currentUser = UserGroupInformation .createRemoteUser(cId.toString()); org.apache.hadoop.security.token.Token nmToken = @@ -231,8 +232,14 @@ public static void startContainer(NodeManager nm, ContainerId cId, public ContainerManagementProtocol run() { Configuration conf = new Configuration(); YarnRPC rpc = YarnRPC.create(conf); - InetSocketAddress containerManagerBindAddress = - NetUtils.createSocketAddrForHost("127.0.0.1", 12345); + InetSocketAddress containerManagerBindAddress = null; + try { + containerManagerBindAddress = + NetUtils.createSocketAddrForHost("127.0.0.1", + ServerSocketUtil.getPort(49152,10)); + } catch (IOException e) { + throw new RuntimeException("Fail To Get the Port"); + } return (ContainerManagementProtocol) rpc.getProxy(ContainerManagementProtocol.class, containerManagerBindAddress, conf); } @@ -264,11 +271,14 @@ public static ContainerId createContainerId() { return containerId; } - private YarnConfiguration createNMConfig() { + private YarnConfiguration createNMConfig() throws RuntimeException, + IOException { YarnConfiguration conf = new YarnConfiguration(); conf.setInt(YarnConfiguration.NM_PMEM_MB, 5*1024); // 5GB - conf.set(YarnConfiguration.NM_ADDRESS, "127.0.0.1:12345"); - conf.set(YarnConfiguration.NM_LOCALIZER_ADDRESS, "127.0.0.1:12346"); + conf.set(YarnConfiguration.NM_ADDRESS, + "127.0.0.1:" + ServerSocketUtil.getPort(49152,10)); + conf.set(YarnConfiguration.NM_LOCALIZER_ADDRESS, "127.0.0.1:" + + ServerSocketUtil.getPort(49152,10)); conf.set(YarnConfiguration.NM_LOG_DIRS, logsDir.getAbsolutePath()); conf.set(YarnConfiguration.NM_REMOTE_APP_LOG_DIR, remoteLogsDir.getAbsolutePath()); conf.set(YarnConfiguration.NM_LOCAL_DIRS, nmLocalDir.getAbsolutePath()); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/BaseContainerManagerTest.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/BaseContainerManagerTest.java index a8e723d..b068f8f 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/BaseContainerManagerTest.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/BaseContainerManagerTest.java @@ -28,12 +28,12 @@ import org.apache.hadoop.yarn.server.nodemanager.executor.DeletionAsUserContext; import org.junit.Assert; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileContext; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.net.ServerSocketUtil; import org.apache.hadoop.fs.UnsupportedFileSystemException; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.token.SecretManager.InvalidToken; @@ -164,8 +164,7 @@ public void setup() throws IOException { remoteLogDir.mkdir(); LOG.info("Created localDir in " + localDir.getAbsolutePath()); LOG.info("Created tmpDir in " + tmpDir.getAbsolutePath()); - - String bindAddress = "0.0.0.0:12345"; + String bindAddress = "0.0.0.0:" + ServerSocketUtil.getPort(49152,10); conf.set(YarnConfiguration.NM_ADDRESS, bindAddress); conf.set(YarnConfiguration.NM_LOCAL_DIRS, localDir.getAbsolutePath()); conf.set(YarnConfiguration.NM_LOG_DIRS, localLogDir.getAbsolutePath());