diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/LinuxContainerExecutor.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/LinuxContainerExecutor.java index e8c46a2..420688e 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/LinuxContainerExecutor.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/LinuxContainerExecutor.java @@ -33,6 +33,7 @@ import org.apache.hadoop.yarn.exceptions.ConfigurationException; import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.Container; import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerDiagnosticsUpdateEvent; +import org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch; import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.privileged.PrivilegedOperation; import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.privileged.PrivilegedOperationException; import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.privileged.PrivilegedOperationExecutor; @@ -280,6 +281,32 @@ protected PrivilegedOperationExecutor getPrivilegedOperationExecutor() { return PrivilegedOperationExecutor.getInstance(getConf()); } + private List replaceWithContainerLogDir(List command, + String appId, String locId, LocalDirsHandlerService dirsHandler) { + // replace the "" with the real container log directory + List newCmds = new ArrayList<>(command.size()); + + Path containerLogPath = new Path("/tmp"); + try { + containerLogPath = getLogDir(dirsHandler, appId, locId); + } catch (IOException e) { + LOG.warn("Can't find the valid container log directory: ", e); + } + + for (String item : command) { + newCmds.add(ContainerLaunch.expandEnvironment(item, containerLogPath)); + } + + return newCmds; + } + + private Path getLogDir(LocalDirsHandlerService dirsHandler, String appId, + String containerId) throws IOException { + String relativeContainerLogDir = ContainerLaunch + .getRelativeContainerLogDir(appId, containerId); + return dirsHandler.getLogPathForWrite(relativeContainerLogDir, false); + } + @Override public void init(Context nmContext) throws IOException { Configuration conf = super.getConf(); @@ -382,6 +409,9 @@ public void startLocalizer(LocalizerStartContext ctx) List localizerArgs = new ArrayList<>(); buildMainArgs(localizerArgs, user, appId, locId, nmAddr, localDirs); + localizerArgs = replaceWithContainerLogDir(localizerArgs, appId, locId, + dirsHandler); + initializeContainerOp.appendArgs(localizerArgs); try { diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/ContainerLocalizer.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/ContainerLocalizer.java index 2378c45..cfafe3e 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/ContainerLocalizer.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/ContainerLocalizer.java @@ -63,6 +63,7 @@ import org.apache.hadoop.util.Shell; import org.apache.hadoop.util.concurrent.HadoopExecutors; import org.apache.hadoop.yarn.YarnUncaughtExceptionHandler; +import org.apache.hadoop.yarn.api.ApplicationConstants; import org.apache.hadoop.yarn.api.records.LocalResource; import org.apache.hadoop.yarn.api.records.LocalResourceVisibility; import org.apache.hadoop.yarn.api.records.SerializedException; @@ -409,7 +410,8 @@ private LocalizerStatus createStatus() throws InterruptedException { public static void buildMainArgs(List command, String user, String appId, String locId, InetSocketAddress nmAddr, List localDirs) { - + + addLog4jSystemProperties("INFO", command); command.add(ContainerLocalizer.class.getName()); command.add(user); command.add(appId); @@ -421,6 +423,16 @@ public static void buildMainArgs(List command, } } + private static void addLog4jSystemProperties( + String logLevel, List command) { + command.add("-Dlog4j.configuration=container-log4j.properties"); + command.add("-D" + YarnConfiguration.YARN_APP_CONTAINER_LOG_DIR + "=" + + ApplicationConstants.LOG_DIR_EXPANSION_VAR); + command.add("-D" + YarnConfiguration.YARN_APP_CONTAINER_LOG_SIZE + "=0"); + command.add("-Dhadoop.root.logger=" + logLevel + ",CLA"); + command.add("-Dhadoop.root.logfile=container-localizer-syslog"); + } + public static void main(String[] argv) throws Throwable { Thread.setDefaultUncaughtExceptionHandler(new YarnUncaughtExceptionHandler()); int nRet = 0; diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/TestContainerLocalizer.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/TestContainerLocalizer.java index 17eee82..e9bc6e3 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/TestContainerLocalizer.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/TestContainerLocalizer.java @@ -18,6 +18,7 @@ package org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer; import static junit.framework.TestCase.assertFalse; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; @@ -675,4 +676,23 @@ public void testUserCacheDirPermission() throws Exception { lfs.getFileStatus(destDirPath.getParent().getParent()).getPermission()); } + @Test + public void testBuildMainArg() { + List command = new ArrayList<>(); + List dirs = new ArrayList<>(); + dirs.add("/yarn/nm"); + ContainerLocalizer.buildMainArgs(command, appUser, appId, containerId, + nmAddr, dirs); + assertEquals("[-Dlog4j.configuration=container-log4j.properties," + + " -Dyarn.app.container.log.dir=," + + " -Dyarn.app.container.log.filesize=0," + + " -Dhadoop.root.logger=INFO,CLA," + + " -Dhadoop.root.logfile=container-localizer-syslog," + + " org.apache.hadoop.yarn.server.nodemanager.containermanager." + + "localizer.ContainerLocalizer" + + ", " + appUser + ", " + appId + ", " + containerId + ", " + + nmAddr.getHostName() + ", " + nmAddr.getPort() + ", /yarn/nm]", + command.toString()); + } + }