diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationConstants.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationConstants.java index 490e95efad5..ad61d2d272b 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationConstants.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationConstants.java @@ -97,7 +97,7 @@ /** * The following two constants are used to expand parameter and it will be * replaced with real parameter expansion marker ('%' for Windows and '$' for - * Linux) by NodeManager on container launch. For example: {{VAR}} will be + * Linux) by NodeManager on container launch. For example: {_{VAR}_} will be * replaced as $VAR on Linux, and %VAR% on Windows. User has to use this * constant to construct class path if user wants cross-platform practice i.e. * submit an application from a Windows client to a Linux/Unix server or vice @@ -105,7 +105,7 @@ */ @Public @Unstable - public static final String PARAMETER_EXPANSION_LEFT="{{"; + public static final String PARAMETER_EXPANSION_LEFT="{_{"; /** * User has to use this constant to construct class path if user wants @@ -114,7 +114,7 @@ */ @Public @Unstable - public static final String PARAMETER_EXPANSION_RIGHT="}}"; + public static final String PARAMETER_EXPANSION_RIGHT="}_}"; public static final String STDERR = "stderr"; 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/launcher/TestContainerLaunch.java b/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 1f218d0942c..ff955d72b63 100644 --- a/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 +++ b/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 @@ -582,6 +582,22 @@ public void testEnvExpansion() throws IOException { + "$HADOOP_LOG_HOME/nm/container/logs", res); } System.out.println(res); + + // The user commands may contains JSON format string which shouldn't be changed. + input = "echo {\"0\": {\"person\": {\"name\": \"John\"}}}" + + Apps.crossPlatformify("HADOOP_LOG_HOME") + + ApplicationConstants.LOG_DIR_EXPANSION_VAR; + res = ContainerLaunch.expandEnvironment(input, logPath); + + if (Shell.WINDOWS) { + Assert.assertEquals( + "echo {\"0\": {\"person\": {\"name\": \"John\"}}}" + + "%HADOOP_LOG_HOME%/nm/container/logs", res); + } else { + Assert.assertEquals( + "echo {\"0\": {\"person\": {\"name\": \"John\"}}}" + + "$HADOOP_LOG_HOME/nm/container/logs", res); + } } @Test (timeout = 20000)