YARN-2741. Made NM web UI serve logs on the drive other than C: on Windows. Contributed by Craig Welch.
(cherry picked from commit 8984e9b177
)
This commit is contained in:
parent
43b1878f86
commit
f40389ae08
|
@ -754,6 +754,9 @@ Release 2.6.0 - UNRELEASED
|
||||||
YARN-2758. Update TestApplicationHistoryClientService to use the new generic
|
YARN-2758. Update TestApplicationHistoryClientService to use the new generic
|
||||||
history store. (Zhijie Shen via xgong)
|
history store. (Zhijie Shen via xgong)
|
||||||
|
|
||||||
|
YARN-2741. Made NM web UI serve logs on the drive other than C: on Windows. (Craig
|
||||||
|
Welch via zjshen)
|
||||||
|
|
||||||
Release 2.5.1 - 2014-09-05
|
Release 2.5.1 - 2014-09-05
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
|
|
@ -77,11 +77,7 @@ public class ContainerLogsUtils {
|
||||||
List<String> logDirs = dirsHandler.getLogDirs();
|
List<String> logDirs = dirsHandler.getLogDirs();
|
||||||
List<File> containerLogDirs = new ArrayList<File>(logDirs.size());
|
List<File> containerLogDirs = new ArrayList<File>(logDirs.size());
|
||||||
for (String logDir : logDirs) {
|
for (String logDir : logDirs) {
|
||||||
try {
|
logDir = new File(logDir).toURI().getPath();
|
||||||
logDir = new URI(logDir).getPath();
|
|
||||||
} catch (URISyntaxException e) {
|
|
||||||
throw new YarnException("Internal error", e);
|
|
||||||
}
|
|
||||||
String appIdStr = ConverterUtils.toString(containerId
|
String appIdStr = ConverterUtils.toString(containerId
|
||||||
.getApplicationAttemptId().getApplicationId());
|
.getApplicationAttemptId().getApplicationId());
|
||||||
File appLogDir = new File(logDir, appIdStr);
|
File appLogDir = new File(logDir, appIdStr);
|
||||||
|
@ -109,11 +105,9 @@ public class ContainerLogsUtils {
|
||||||
application.getAppId().toString(), containerId.toString());
|
application.getAppId().toString(), containerId.toString());
|
||||||
Path logPath = dirsHandler.getLogPathToRead(
|
Path logPath = dirsHandler.getLogPathToRead(
|
||||||
relativeContainerLogDir + Path.SEPARATOR + fileName);
|
relativeContainerLogDir + Path.SEPARATOR + fileName);
|
||||||
URI logPathURI = new URI(logPath.toString());
|
URI logPathURI = new File(logPath.toString()).toURI();
|
||||||
File logFile = new File(logPathURI.getPath());
|
File logFile = new File(logPathURI.getPath());
|
||||||
return logFile;
|
return logFile;
|
||||||
} catch (URISyntaxException e) {
|
|
||||||
throw new YarnException("Internal error", e);
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOG.warn("Failed to find log file", e);
|
LOG.warn("Failed to find log file", e);
|
||||||
throw new NotFoundException("Cannot find this log on the local disk.");
|
throw new NotFoundException("Cannot find this log on the local disk.");
|
||||||
|
|
|
@ -28,6 +28,7 @@ import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -36,11 +37,16 @@ import java.util.concurrent.ConcurrentMap;
|
||||||
|
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
|
import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
|
||||||
|
import org.apache.hadoop.fs.Path;
|
||||||
import org.apache.hadoop.io.nativeio.NativeIO;
|
import org.apache.hadoop.io.nativeio.NativeIO;
|
||||||
import org.apache.hadoop.security.UserGroupInformation;
|
import org.apache.hadoop.security.UserGroupInformation;
|
||||||
import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
|
import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
|
||||||
import org.apache.hadoop.yarn.api.records.ApplicationId;
|
import org.apache.hadoop.yarn.api.records.ApplicationId;
|
||||||
import org.apache.hadoop.yarn.api.records.ContainerId;
|
import org.apache.hadoop.yarn.api.records.ContainerId;
|
||||||
|
import org.apache.hadoop.yarn.api.records.impl.pb.ContainerIdPBImpl;
|
||||||
|
import org.apache.hadoop.yarn.api.records.impl.pb.ApplicationAttemptIdPBImpl;
|
||||||
|
import org.apache.hadoop.yarn.api.records.impl.pb.ApplicationIdPBImpl;
|
||||||
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerImpl;
|
||||||
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
||||||
import org.apache.hadoop.yarn.event.AsyncDispatcher;
|
import org.apache.hadoop.yarn.event.AsyncDispatcher;
|
||||||
import org.apache.hadoop.yarn.exceptions.YarnException;
|
import org.apache.hadoop.yarn.exceptions.YarnException;
|
||||||
|
@ -210,4 +216,80 @@ public class TestContainerLogsPage {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLogDirWithDriveLetter() throws Exception {
|
||||||
|
//To verify that logs paths which include drive letters (Windows)
|
||||||
|
//do not lose their drive letter specification
|
||||||
|
LocalDirsHandlerService localDirs = mock(LocalDirsHandlerService.class);
|
||||||
|
List<String> logDirs = new ArrayList<String>();
|
||||||
|
logDirs.add("F:/nmlogs");
|
||||||
|
when(localDirs.getLogDirs()).thenReturn(logDirs);
|
||||||
|
|
||||||
|
ApplicationIdPBImpl appId = mock(ApplicationIdPBImpl.class);
|
||||||
|
when(appId.toString()).thenReturn("app_id_1");
|
||||||
|
|
||||||
|
ApplicationAttemptIdPBImpl appAttemptId =
|
||||||
|
mock(ApplicationAttemptIdPBImpl.class);
|
||||||
|
when(appAttemptId.getApplicationId()).thenReturn(appId);
|
||||||
|
|
||||||
|
ContainerId containerId = mock(ContainerIdPBImpl.class);
|
||||||
|
when(containerId.getApplicationAttemptId()).thenReturn(appAttemptId);
|
||||||
|
|
||||||
|
List<File> logDirFiles = ContainerLogsUtils.getContainerLogDirs(
|
||||||
|
containerId, localDirs);
|
||||||
|
|
||||||
|
Assert.assertTrue("logDir lost drive letter " +
|
||||||
|
logDirFiles.get(0),
|
||||||
|
logDirFiles.get(0).toString().indexOf("F:" + File.separator +
|
||||||
|
"nmlogs") > -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLogFileWithDriveLetter() throws Exception {
|
||||||
|
|
||||||
|
ContainerImpl container = mock(ContainerImpl.class);
|
||||||
|
|
||||||
|
ApplicationIdPBImpl appId = mock(ApplicationIdPBImpl.class);
|
||||||
|
when(appId.toString()).thenReturn("appId");
|
||||||
|
|
||||||
|
Application app = mock(Application.class);
|
||||||
|
when(app.getAppId()).thenReturn(appId);
|
||||||
|
|
||||||
|
ApplicationAttemptIdPBImpl appAttemptId =
|
||||||
|
mock(ApplicationAttemptIdPBImpl.class);
|
||||||
|
when(appAttemptId.getApplicationId()).thenReturn(appId);
|
||||||
|
|
||||||
|
ConcurrentMap<ApplicationId, Application> applications =
|
||||||
|
new ConcurrentHashMap<ApplicationId, Application>();
|
||||||
|
applications.put(appId, app);
|
||||||
|
|
||||||
|
ContainerId containerId = mock(ContainerIdPBImpl.class);
|
||||||
|
when(containerId.toString()).thenReturn("containerId");
|
||||||
|
when(containerId.getApplicationAttemptId()).thenReturn(appAttemptId);
|
||||||
|
|
||||||
|
ConcurrentMap<ContainerId, Container> containers =
|
||||||
|
new ConcurrentHashMap<ContainerId, Container>();
|
||||||
|
|
||||||
|
containers.put(containerId, container);
|
||||||
|
|
||||||
|
LocalDirsHandlerService localDirs = mock(LocalDirsHandlerService.class);
|
||||||
|
when(localDirs.getLogPathToRead("appId" + Path.SEPARATOR + "containerId" +
|
||||||
|
Path.SEPARATOR + "fileName"))
|
||||||
|
.thenReturn(new Path("F:/nmlogs/appId/containerId/fileName"));
|
||||||
|
|
||||||
|
NMContext context = mock(NMContext.class);
|
||||||
|
when(context.getLocalDirsHandler()).thenReturn(localDirs);
|
||||||
|
when(context.getApplications()).thenReturn(applications);
|
||||||
|
when(context.getContainers()).thenReturn(containers);
|
||||||
|
|
||||||
|
File logFile = ContainerLogsUtils.getContainerLogFile(containerId,
|
||||||
|
"fileName", null, context);
|
||||||
|
|
||||||
|
Assert.assertTrue("logFile lost drive letter " +
|
||||||
|
logFile,
|
||||||
|
logFile.toString().indexOf("F:" + File.separator + "nmlogs") > -1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue