diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationConstants.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationConstants.java index 02b15c4..a78a6a2 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationConstants.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationConstants.java @@ -177,7 +177,25 @@ /** * $HADOOP_YARN_HOME */ - HADOOP_YARN_HOME("HADOOP_YARN_HOME"); + HADOOP_YARN_HOME("HADOOP_YARN_HOME"), + + /** + * $CONTAINERID + * Final, non-modifiable. + */ + CONTAINERID("CONTAINERID"), + + /** + * $NM_HOST + * Final, non-modifiable. + */ + NM_HOST("NM_HOST"), + + /** + * $NM_PORT + * Final, non-modifiable. + */ + NM_PORT("NM_PORT"); private final String variable; private Environment(String variable) { diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/ContainerLaunch.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/ContainerLaunch.java index 71345e0..cb2591e 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/ContainerLaunch.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/ContainerLaunch.java @@ -49,6 +49,7 @@ import org.apache.hadoop.yarn.api.ApplicationConstants.Environment; import org.apache.hadoop.yarn.api.records.ContainerId; import org.apache.hadoop.yarn.api.records.ContainerLaunchContext; +import org.apache.hadoop.yarn.api.records.NodeId; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.event.Dispatcher; import org.apache.hadoop.yarn.server.nodemanager.ContainerExecutor; @@ -82,6 +83,7 @@ private final Application app; private final Container container; private final Configuration conf; + private final NodeId nodeId; private volatile AtomicBoolean shouldLaunchContainer = new AtomicBoolean(false); private volatile AtomicBoolean completed = new AtomicBoolean(false); @@ -95,13 +97,14 @@ public ContainerLaunch(Configuration configuration, Dispatcher dispatcher, ContainerExecutor exec, Application app, Container container, - LocalDirsHandlerService dirsHandler) { + LocalDirsHandlerService dirsHandler, NodeId nodeId) { this.conf = configuration; this.app = app; this.exec = exec; this.container = container; this.dispatcher = dispatcher; this.dirsHandler = dirsHandler; + this.nodeId = nodeId; this.sleepDelayBeforeSigKill = conf.getLong(YarnConfiguration.NM_SLEEP_DELAY_BEFORE_SIGKILL_MS, YarnConfiguration.DEFAULT_NM_SLEEP_DELAY_BEFORE_SIGKILL_MS); @@ -541,6 +544,14 @@ public void sanitizeEnv(Map environment, putEnvIfNotNull(environment, Environment.LOGNAME.name(),container.getUser()); + putEnvIfNotNull(environment, Environment.CONTAINERID.name(), container + .getContainerID().toString()); + + putEnvIfNotNull(environment, Environment.NM_PORT.name(), + String.valueOf(nodeId.getPort())); + + putEnvIfNotNull(environment, Environment.NM_HOST.name(), nodeId.getHost()); + putEnvIfNotNull(environment, Environment.HOME.name(), conf.get( diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/ContainersLauncher.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/ContainersLauncher.java index 1e3c18b..756042b 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/ContainersLauncher.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/ContainersLauncher.java @@ -119,7 +119,7 @@ public void handle(ContainersLauncherEvent event) { containerId.getApplicationAttemptId().getApplicationId()); ContainerLaunch launch = new ContainerLaunch(getConfig(), dispatcher, - exec, app, event.getContainer(), dirsHandler); + exec, app, event.getContainer(), dirsHandler, context.getNodeId()); running.put(containerId, new RunningContainer(containerLauncher.submit(launch), launch)); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/TestContainerLaunch.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/TestContainerLaunch.java index 7027072..1ae6043 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/TestContainerLaunch.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/TestContainerLaunch.java @@ -51,7 +51,6 @@ import org.apache.hadoop.yarn.api.records.LocalResource; import org.apache.hadoop.yarn.api.records.LocalResourceType; import org.apache.hadoop.yarn.api.records.LocalResourceVisibility; -import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.api.records.URL; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.server.nodemanager.ContainerExecutor.ExitCode; @@ -167,24 +166,6 @@ public static void setNewEnvironmentHack(Map newenv) throws Exce public void testContainerEnvVariables() throws Exception { containerManager.start(); - Map envWithDummy = new HashMap(); - envWithDummy.putAll(System.getenv()); - envWithDummy.put(Environment.MALLOC_ARENA_MAX.name(), "99"); - setNewEnvironmentHack(envWithDummy); - - String malloc = System.getenv(Environment.MALLOC_ARENA_MAX.name()); - File scriptFile = new File(tmpDir, "scriptFile.sh"); - PrintWriter fileWriter = new PrintWriter(scriptFile); - File processStartFile = - new File(tmpDir, "env_vars.txt").getAbsoluteFile(); - fileWriter.write("\numask 0"); // So that start file is readable by the test - fileWriter.write("\necho $" + Environment.MALLOC_ARENA_MAX.name() + " > " + processStartFile); - fileWriter.write("\necho $$ >> " + processStartFile); - fileWriter.write("\nexec sleep 100"); - fileWriter.close(); - - assert(malloc != null && !"".equals(malloc)); - ContainerLaunchContext containerLaunchContext = recordFactory.newRecordInstance(ContainerLaunchContext.class); @@ -204,6 +185,32 @@ public void testContainerEnvVariables() throws Exception { containerLaunchContext.setUser(user); + Map envWithDummy = new HashMap(); + envWithDummy.putAll(System.getenv()); + envWithDummy.put(Environment.MALLOC_ARENA_MAX.name(), "99"); + envWithDummy.put(Environment.CONTAINERID.name(), cId.toString()); + envWithDummy.put(Environment.NM_HOST.name(), + context.getNodeId().getHost()); + envWithDummy.put(Environment.NM_PORT.name(), + String.valueOf(context.getNodeId().getPort())); + setNewEnvironmentHack(envWithDummy); + + String malloc = System.getenv(Environment.MALLOC_ARENA_MAX.name()); + File scriptFile = new File(tmpDir, "scriptFile.sh"); + PrintWriter fileWriter = new PrintWriter(scriptFile); + File processStartFile = + new File(tmpDir, "env_vars.txt").getAbsoluteFile(); + fileWriter.write("\numask 0"); // So that start file is readable by the test + fileWriter.write("\necho $" + Environment.MALLOC_ARENA_MAX.name() + " >> " + processStartFile); + fileWriter.write("\necho $" + Environment.CONTAINERID.name() + " >> " + processStartFile); + fileWriter.write("\necho $" + Environment.NM_HOST.name() + " >> " + processStartFile); + fileWriter.write("\necho $" + Environment.NM_PORT.name() + " >> " + processStartFile); + fileWriter.write("\necho $$ >> " + processStartFile); + fileWriter.write("\nexec sleep 100"); + fileWriter.close(); + + assert(malloc != null && !"".equals(malloc)); + // upload the script file so that the container can run it URL resource_alpha = ConverterUtils.getYarnUrlFromPath(localFS @@ -246,6 +253,11 @@ public void testContainerEnvVariables() throws Exception { BufferedReader reader = new BufferedReader(new FileReader(processStartFile)); Assert.assertEquals(malloc, reader.readLine()); + Assert.assertEquals(cId.toString(), reader.readLine()); + Assert.assertEquals(context.getNodeId().getHost(), reader.readLine()); + Assert.assertEquals(String.valueOf(context.getNodeId().getPort()), + reader.readLine()); + // Get the pid of the process String pid = reader.readLine().trim(); // No more lines