From 7146359bfd436a76585fb1f3ea93716795308cec Mon Sep 17 00:00:00 2001 From: Jason Lowe Date: Fri, 28 Oct 2016 15:48:58 +0000 Subject: [PATCH] YARN-5027. NM should clean up app log dirs after NM restart. Contributed by sandflee --- .../ResourceLocalizationService.java | 56 ++++++++++++++++++- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/ResourceLocalizationService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/ResourceLocalizationService.java index 2cf6ee9094..4bd004b83a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/ResourceLocalizationService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/ResourceLocalizationService.java @@ -242,6 +242,7 @@ public void serviceInit(Configuration conf) throws Exception { if (!stateStore.canRecover()|| stateStore.isNewlyCreated()) { cleanUpLocalDirs(lfs, delService); + cleanupLogDirs(lfs, delService); initializeLocalDirs(lfs); initializeLogDirs(lfs); } @@ -1374,9 +1375,9 @@ private void initializeLogDirs(FileContext lfs) { } } - private void initializeLogDir(FileContext lfs, String logDir) { + private void initializeLogDir(FileContext fs, String logDir) { try { - lfs.mkdir(new Path(logDir), null, true); + fs.mkdir(new Path(logDir), null, true); } catch (FileAlreadyExistsException fe) { // do nothing } catch (IOException e) { @@ -1386,6 +1387,57 @@ private void initializeLogDir(FileContext lfs, String logDir) { } } + private void cleanupLogDirs(FileContext fs, DeletionService del) { + for (String logDir : dirsHandler.getLogDirsForCleanup()) { + try { + cleanupLogDir(fs, del, logDir); + } catch (IOException e) { + LOG.warn("failed to cleanup app log dir " + logDir, e); + } + } + } + + private void cleanupLogDir(FileContext fs, DeletionService del, + String logDir) throws IOException { + if (!fs.util().exists(new Path(logDir))){ + return; + } + renameAppLogDir(logDir); + deleteAppLogDir(fs, del, logDir); + } + + private void renameAppLogDir(String logDir) throws IOException { + long currentTimeStamp = System.currentTimeMillis(); + RemoteIterator fileStatuses = + lfs.listStatus(new Path(logDir)); + if (fileStatuses != null) { + while (fileStatuses.hasNext()) { + FileStatus fileStatus = fileStatuses.next(); + String appName = fileStatus.getPath().getName(); + if (appName.matches("^application_\\d+_\\d+$")) { + lfs.rename(new Path(logDir, appName), + new Path(logDir, appName + "_DEL_" + currentTimeStamp)); + } + } + } + } + + private void deleteAppLogDir(FileContext fs, DeletionService del, + String logDir) throws IOException { + RemoteIterator fileStatuses = + fs.listStatus(new Path(logDir)); + if (fileStatuses != null) { + while (fileStatuses.hasNext()) { + FileStatus fileStatus = fileStatuses.next(); + String appName = fileStatus.getPath().getName(); + if (appName.matches("^application_\\d+_\\d+_DEL_\\d+$")) { + LOG.info("delete app log dir," + appName); + del.delete(null, fileStatus.getPath()); + } + } + } + } + private void cleanUpLocalDirs(FileContext lfs, DeletionService del) { for (String localDir : dirsHandler.getLocalDirsForCleanup()) { cleanUpLocalDir(lfs, del, localDir);