HadoopArchiveLogsRunner implements Tool { @Override public int run(String[] args) throws Exception { handleOpts(args); Integer exitCode = 1; UserGroupInformation loginUser = UserGroupInformation.getLoginUser(); if (!proxy || loginUser.getShortUserName().equals(user)) { LOG.info("Running as " + user); exitCode = runInternal(); } else { LOG.info("Running as " + loginUser.getShortUserName() + " but will " + "impersonate " + user); UserGroupInformation proxyUser = UserGroupInformation.createProxyUser(user, loginUser); exitCode = proxyUser.doAs(new PrivilegedExceptionAction<Integer>() { @Override public Integer run() throws Exception { return runInternal(); } }); } return exitCode; } HadoopArchiveLogsRunner(Configuration conf); static void main(String[] args); @Override int run(String[] args); @Override void setConf(Configuration conf); @Override Configuration getConf();  }
@Test(timeout = 50000) public void testHadoopArchiveLogs() throws Exception { MiniYARNCluster yarnCluster = null; MiniDFSCluster dfsCluster = null; FileSystem fs = null; try { Configuration conf = new YarnConfiguration(); conf.setBoolean(YarnConfiguration.LOG_AGGREGATION_ENABLED, true); conf.setBoolean(YarnConfiguration.YARN_MINICLUSTER_FIXED_PORTS, true); yarnCluster = new MiniYARNCluster(TestHadoopArchiveLogsRunner.class.getSimpleName(), 1, 2, 1, 1); yarnCluster.init(conf); yarnCluster.start(); conf = yarnCluster.getConfig(); dfsCluster = new MiniDFSCluster.Builder(conf).numDataNodes(1).build(); conf = new JobConf(conf); ApplicationId app1 = ApplicationId.newInstance(System.currentTimeMillis(), 1); fs = FileSystem.get(conf); Path remoteRootLogDir = new Path(conf.get( YarnConfiguration.NM_REMOTE_APP_LOG_DIR, YarnConfiguration.DEFAULT_NM_REMOTE_APP_LOG_DIR)); Path workingDir = new Path(remoteRootLogDir, "archive-logs-work"); String suffix = "logs"; Path logDir = new Path(remoteRootLogDir, new Path(System.getProperty("user.name"), suffix)); fs.mkdirs(logDir); Path app1Path = new Path(logDir, app1.toString()); fs.mkdirs(app1Path); createFile(fs, new Path(app1Path, "log1"), 3); createFile(fs, new Path(app1Path, "log2"), 4); createFile(fs, new Path(app1Path, "log3"), 2); FileStatus[] app1Files = fs.listStatus(app1Path); Assert.assertEquals(3, app1Files.length); String[] args = new String[]{ "-appId", app1.toString(), "-user", System.getProperty("user.name"), "-workingDir", workingDir.toString(), "-remoteRootLogDir", remoteRootLogDir.toString(), "-suffix", suffix}; final HadoopArchiveLogsRunner halr = new HadoopArchiveLogsRunner(conf); assertEquals(0, ToolRunner.run(halr, args)); fs = FileSystem.get(conf); app1Files = fs.listStatus(app1Path); Assert.assertEquals(1, app1Files.length); FileStatus harFile = app1Files[0]; Assert.assertEquals(app1.toString() + ".har", harFile.getPath().getName()); Path harPath = new Path("har: FileStatus[] harLogs = HarFs.get(harPath.toUri(), conf).listStatus(harPath); Assert.assertEquals(3, harLogs.length); Arrays.sort(harLogs, new Comparator<FileStatus>() { @Override public int compare(FileStatus o1, FileStatus o2) { return o1.getPath().getName().compareTo(o2.getPath().getName()); } }); Assert.assertEquals("log1", harLogs[0].getPath().getName()); Assert.assertEquals(3 * FILE_SIZE_INCREMENT, harLogs[0].getLen()); Assert.assertEquals( new FsPermission(FsAction.READ_WRITE, FsAction.READ, FsAction.NONE), harLogs[0].getPermission()); Assert.assertEquals(System.getProperty("user.name"), harLogs[0].getOwner()); Assert.assertEquals("log2", harLogs[1].getPath().getName()); Assert.assertEquals(4 * FILE_SIZE_INCREMENT, harLogs[1].getLen()); Assert.assertEquals( new FsPermission(FsAction.READ_WRITE, FsAction.READ, FsAction.NONE), harLogs[1].getPermission()); Assert.assertEquals(System.getProperty("user.name"), harLogs[1].getOwner()); Assert.assertEquals("log3", harLogs[2].getPath().getName()); Assert.assertEquals(2 * FILE_SIZE_INCREMENT, harLogs[2].getLen()); Assert.assertEquals( new FsPermission(FsAction.READ_WRITE, FsAction.READ, FsAction.NONE), harLogs[2].getPermission()); Assert.assertEquals(System.getProperty("user.name"), harLogs[2].getOwner()); Assert.assertEquals(0, fs.listStatus(workingDir).length); } finally { if (yarnCluster != null) { yarnCluster.stop(); } if (fs != null) { fs.close(); } if (dfsCluster != null) { dfsCluster.shutdown(); } } }