> On Oct. 6, 2017, 12:26 a.m., Robert Kanter wrote: > > tools/src/main/java/org/apache/oozie/tools/diag/AppInfoCollector.java > > Lines 173-174 (patched) > > <https://reviews.apache.org/r/62459/diff/10/?file=1845962#file1845962line173> > > > > ````LogAggregationUtils```` is marked ````@Private```` so we shouldn't > > be using it. Hadoop can change things incompatibly here.
What do you think about borrowing/inlining/copying those functions from Hadoop 2.6 too? I was thinking about it and it is probably better than bringing back the initial ``ExecutorService`` based approach. I am thinking of a class like: ```java // TODO: once OOZIE-2983 ("Stream the Launcher AM Logs") is done, remove it. public class OozieLauncherLogFetcher { private static final String TMP_FILE_SUFFIX = ".tmp"; final private Configuration hadoopConfig; public OozieLauncherLogFetcher(final Configuration hadoopConfig) { this.hadoopConfig = hadoopConfig; } // Borrowed code from org.apache.hadoop.yarn.logaggregation.LogCLIHelpers private static void logDirNotExist(String remoteAppLogDir) { System.out.println(remoteAppLogDir + "does not exist."); System.out.println("Log aggregation has not completed or is not enabled."); } // Borrowed code from org.apache.hadoop.yarn.logaggregation.LogCLIHelpers private static void emptyLogDir(String remoteAppLogDir) { System.out.println(remoteAppLogDir + "does not have any log files."); } // Borrowed code from org.apache.hadoop.yarn.logaggregation.LogAggregationUtils public static String getRemoteNodeLogDirSuffix(Configuration conf) { return conf.get(YarnConfiguration.NM_REMOTE_APP_LOG_DIR_SUFFIX, YarnConfiguration.DEFAULT_NM_REMOTE_APP_LOG_DIR_SUFFIX); } // Borrowed code from org.apache.hadoop.yarn.logaggregation.LogAggregationUtils public static Path getRemoteLogSuffixedDir(Path remoteRootLogDir, String user, String suffix) { return suffix != null && !suffix.isEmpty() ? new Path(getRemoteLogUserDir(remoteRootLogDir, user), suffix) : getRemoteLogUserDir(remoteRootLogDir, user); } // Borrowed code from org.apache.hadoop.yarn.logaggregation.LogAggregationUtils public static Path getRemoteLogUserDir(Path remoteRootLogDir, String user) { return new Path(remoteRootLogDir, user); } // Borrowed code from org.apache.hadoop.yarn.logaggregation.LogAggregationUtils public static Path getRemoteAppLogDir(Path remoteRootLogDir, ApplicationId appId, String user, String suffix) { return new Path(getRemoteLogSuffixedDir(remoteRootLogDir, user, suffix), appId.toString()); } // Borrowed code from org.apache.hadoop.yarn.logaggregation.LogCLIHelpers public int dumpAllContainersLogs(ApplicationId appId, String appOwner, PrintStream out) throws IOException { Path remoteRootLogDir = new Path(hadoopConfig.get(YarnConfiguration.NM_REMOTE_APP_LOG_DIR, YarnConfiguration.DEFAULT_NM_REMOTE_APP_LOG_DIR)); String logDirSuffix = getRemoteNodeLogDirSuffix(hadoopConfig); Path remoteAppLogDir = getRemoteAppLogDir(remoteRootLogDir, appId, appOwner, logDirSuffix); RemoteIterator nodeFiles; try { Path qualifiedLogDir = FileContext.getFileContext(hadoopConfig).makeQualified(remoteAppLogDir); nodeFiles = FileContext.getFileContext(qualifiedLogDir.toUri(), hadoopConfig).listStatus(remoteAppLogDir); } catch (FileNotFoundException fileNotFoundException) { logDirNotExist(remoteAppLogDir.toString()); return -1; } boolean foundAnyLogs = false; while(true) { FileStatus thisNodeFile; do { if (!nodeFiles.hasNext()) { if (!foundAnyLogs) { emptyLogDir(remoteAppLogDir.toString()); return -1; } return 0; } thisNodeFile = (FileStatus)nodeFiles.next(); } while(thisNodeFile.getPath().getName().endsWith(TMP_FILE_SUFFIX)); AggregatedLogFormat.LogReader reader = new AggregatedLogFormat.LogReader(hadoopConfig, thisNodeFile.getPath()); try { AggregatedLogFormat.LogKey key = new AggregatedLogFormat.LogKey(); DataInputStream valueStream = reader.next(key); while(valueStream != null) { String containerString = "\n\nContainer: " + key + " on " + thisNodeFile.getPath().getName(); out.println(containerString); out.println(StringUtils.repeat("=", containerString.length())); while(true) { try { AggregatedLogFormat.LogReader.readAContainerLogsForALogType(valueStream, out, thisNodeFile.getModificationTime()); foundAnyLogs = true; } catch (EOFException eofException) { key = new AggregatedLogFormat.LogKey(); valueStream = reader.next(key); break; } } } } finally { reader.close(); } } } } ``` - Attila ----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://reviews.apache.org/r/62459/#review187223 ----------------------------------------------------------- On Oct. 4, 2017, 2:18 p.m., Attila Sasvari wrote: > > ----------------------------------------------------------- > This is an automatically generated e-mail. To reply, visit: > https://reviews.apache.org/r/62459/ > ----------------------------------------------------------- > > (Updated Oct. 4, 2017, 2:18 p.m.) > > > Review request for oozie. > > > Repository: oozie-git > > > Description > ------- > > A diagnostic tool that collects a bunch of job and other information from > Oozie in a zip file. > > > Diffs > ----- > > docs/src/site/twiki/DG_CommandLineTool.twiki > d4047671876dcc3279a2ec379bc1d003f5e6f1aa > pom.xml 0b94484da1c97618e9168cea0ebbfff7f70f723c > tools/pom.xml 7306a14e7b237977be00f8fe28e34573540fd508 > tools/src/main/bin/oozie-diag-bundle-collector.sh PRE-CREATION > tools/src/main/java/org/apache/oozie/tools/diag/AppInfoCollector.java > PRE-CREATION > tools/src/main/java/org/apache/oozie/tools/diag/ArgParser.java PRE-CREATION > > tools/src/main/java/org/apache/oozie/tools/diag/DiagBundleCollectorDriver.java > PRE-CREATION > tools/src/main/java/org/apache/oozie/tools/diag/DiagBundleCompressor.java > PRE-CREATION > tools/src/main/java/org/apache/oozie/tools/diag/DiagBundleEntryWriter.java > PRE-CREATION > tools/src/main/java/org/apache/oozie/tools/diag/DiagOozieClient.java > PRE-CREATION > tools/src/main/java/org/apache/oozie/tools/diag/MetricsCollector.java > PRE-CREATION > tools/src/main/java/org/apache/oozie/tools/diag/ServerInfoCollector.java > PRE-CREATION > tools/src/test/java/org/apache/oozie/tools/diag/TestAppInfoCollector.java > PRE-CREATION > tools/src/test/java/org/apache/oozie/tools/diag/TestArgParser.java > PRE-CREATION > tools/src/test/java/org/apache/oozie/tools/diag/TestMetricsCollector.java > PRE-CREATION > > tools/src/test/java/org/apache/oozie/tools/diag/TestServerInfoCollector.java > PRE-CREATION > > > Diff: https://reviews.apache.org/r/62459/diff/10/ > > > Testing > ------- > > - new unit tests: TestOozieDiagBundleCollector > - started Oozie with a pseudo hadoop cluster, submitted a couple workflows, > and executed the following commands: > -- ``bin/oozie-diag-bundle-collector.sh`` (usage info printed), > -- ``bin/oozie-diag-bundle-collector.sh -numworkflows 2000 -oozie > http://localhost:11000/oozie -output /tmp``, > -- ``bin/oozie-diag-bundle-collector.sh -jobs > 0000001-170918144116149-oozie-asas-W -oozie http://localhost:11000/oozie > -output .`` (verified zip the tool generated). > > > Thanks, > > Attila Sasvari > >