KYLIN-1614 Job diag tool
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/79d1c6d5 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/79d1c6d5 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/79d1c6d5 Branch: refs/heads/1.5.x-HBase1.x Commit: 79d1c6d5450c054b28eea19d486b069f3650c5f7 Parents: eb4cec6 Author: lidongsjtu <lid...@apache.org> Authored: Sat Apr 30 14:36:18 2016 +0800 Committer: lidongsjtu <lid...@apache.org> Committed: Sat Apr 30 14:42:20 2016 +0800 ---------------------------------------------------------------------- .../kylin/tool/AbstractInfoExtractor.java | 29 +++++-- .../apache/kylin/tool/ClientEnvExtractor.java | 89 ++++++++++++++++++++ .../apache/kylin/tool/CubeMetaExtractor.java | 2 +- .../org/apache/kylin/tool/DiagnosisInfoCLI.java | 42 +++------ .../apache/kylin/tool/JobDiagnosisInfoCLI.java | 17 +++- .../apache/kylin/tool/KylinLogExtractor.java | 2 +- .../java/org/apache/kylin/tool/ToolUtil.java | 1 + 7 files changed, 139 insertions(+), 43 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/79d1c6d5/tool/src/main/java/org/apache/kylin/tool/AbstractInfoExtractor.java ---------------------------------------------------------------------- diff --git a/tool/src/main/java/org/apache/kylin/tool/AbstractInfoExtractor.java b/tool/src/main/java/org/apache/kylin/tool/AbstractInfoExtractor.java index 64e1db8..23a4559 100644 --- a/tool/src/main/java/org/apache/kylin/tool/AbstractInfoExtractor.java +++ b/tool/src/main/java/org/apache/kylin/tool/AbstractInfoExtractor.java @@ -28,6 +28,7 @@ import org.apache.commons.cli.OptionBuilder; import org.apache.commons.cli.Options; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; +import org.apache.kylin.common.KylinVersion; import org.apache.kylin.common.util.AbstractApplication; import org.apache.kylin.common.util.OptionsHelper; import org.apache.kylin.common.util.ZipFileUtils; @@ -46,12 +47,11 @@ public abstract class AbstractInfoExtractor extends AbstractApplication { @SuppressWarnings("static-access") private static final Option OPTION_QUIET = OptionBuilder.withArgName("quiet").hasArg().isRequired(false).withDescription("specify whether to print final result").create("quiet"); - - private static final String DEFAULT_PACKAGE_PREFIX = "dump"; + private static final String DEFAULT_PACKAGE_TYPE = "base"; protected final Options options; - protected String packagePrefix; + protected String packageType; protected File exportDir; public AbstractInfoExtractor() { @@ -60,7 +60,7 @@ public abstract class AbstractInfoExtractor extends AbstractApplication { options.addOption(OPTION_COMPRESS); options.addOption(OPTION_QUIET); - packagePrefix = DEFAULT_PACKAGE_PREFIX; + packageType = DEFAULT_PACKAGE_TYPE; } @Override @@ -82,17 +82,18 @@ public abstract class AbstractInfoExtractor extends AbstractApplication { } // create new folder to contain the output - String packageName = packagePrefix + "_" + new SimpleDateFormat("YYYY_MM_dd_HH_mm_ss").format(new Date()); + String packageName = packageType.toLowerCase() + "_" + new SimpleDateFormat("YYYY_MM_dd_HH_mm_ss").format(new Date()); if (new File(exportDest).exists()) { exportDest = exportDest + packageName + "/"; } exportDir = new File(exportDest); + dumpBasicDiagInfo(); executeExtract(optionsHelper, exportDir); // compress to zip package if (compress) { - File tempZipFile = File.createTempFile(packagePrefix + "_", ".zip"); + File tempZipFile = File.createTempFile(packageType + "_", ".zip"); ZipFileUtils.compressZipFile(exportDir.getAbsolutePath(), tempZipFile.getAbsolutePath()); FileUtils.cleanDirectory(exportDir); @@ -105,12 +106,26 @@ public abstract class AbstractInfoExtractor extends AbstractApplication { if (!quiet) { StringBuffer output = new StringBuffer(); output.append("\n========================================"); - output.append("\nDump " + packagePrefix + " package locates at: \n" + exportDir.getAbsolutePath()); + output.append("\nDump " + packageType + " package locates at: \n" + exportDir.getAbsolutePath()); output.append("\n========================================"); logger.info(output.toString()); } } + private void dumpBasicDiagInfo() { + try { + String output = KylinVersion.getKylinClientInformation() + "\n"; + FileUtils.writeStringToFile(new File(exportDir, "kylin_env"), output); + + StringBuilder basicSb = new StringBuilder(); + basicSb.append(ToolUtil.getHBaseMetaStoreId()).append("\n"); + basicSb.append("PackageType: ").append(packageType.toUpperCase()).append("\n"); + FileUtils.writeStringToFile(new File(exportDir, "info"), basicSb.toString()); + } catch (Exception e) { + logger.warn("Error in export process info.", e); + } + } + protected abstract void executeExtract(OptionsHelper optionsHelper, File exportDir) throws Exception; public String getExportDest() { http://git-wip-us.apache.org/repos/asf/kylin/blob/79d1c6d5/tool/src/main/java/org/apache/kylin/tool/ClientEnvExtractor.java ---------------------------------------------------------------------- diff --git a/tool/src/main/java/org/apache/kylin/tool/ClientEnvExtractor.java b/tool/src/main/java/org/apache/kylin/tool/ClientEnvExtractor.java new file mode 100644 index 0000000..b0e79d4 --- /dev/null +++ b/tool/src/main/java/org/apache/kylin/tool/ClientEnvExtractor.java @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.kylin.tool; + +import java.io.File; +import java.io.IOException; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.kylin.common.KylinConfig; +import org.apache.kylin.common.util.CliCommandExecutor; +import org.apache.kylin.common.util.OptionsHelper; +import org.apache.kylin.common.util.Pair; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.io.Files; + +public class ClientEnvExtractor extends AbstractInfoExtractor { + private KylinConfig kylinConfig; + private CliCommandExecutor cmdExecutor; + private static final Logger logger = LoggerFactory.getLogger(ClientEnvExtractor.class); + + public ClientEnvExtractor() throws IOException { + super(); + packageType = "client"; + kylinConfig = KylinConfig.getInstanceFromEnv(); + cmdExecutor = kylinConfig.getCliCommandExecutor(); + } + + @Override + protected void executeExtract(OptionsHelper optionsHelper, File exportDir) throws Exception { + addLocalFile("/sys/kernel/mm/transparent_hugepage/defrag", "linux/transparent_hugepage"); + addLocalFile("/proc/sys/vm/swappiness", "linux/swappiness"); + addShellOutput("lsb_release -a", "linux", "lsb_release"); + addShellOutput("ps aux|grep kylin", "kylin", "processes"); + } + + private void addLocalFile(String src, String destDir) { + try { + File srcFile = new File(src); + File destDirFile = null; + if (StringUtils.isEmpty(destDir)) { + destDirFile = new File(exportDir, destDir); + FileUtils.forceMkdir(destDirFile); + } else { + destDirFile = exportDir; + } + FileUtils.forceMkdir(destDirFile); + Files.copy(srcFile, new File(destDirFile, srcFile.getName())); + } catch (Exception e) { + logger.warn("Failed to copy " + src + ".", e); + } + } + + private void addShellOutput(String cmd, String destDir, String filename) { + try { + File destDirFile = null; + if (StringUtils.isEmpty(destDir)) { + destDirFile = new File(exportDir, destDir); + FileUtils.forceMkdir(destDirFile); + } else { + destDirFile = exportDir; + } + Pair<Integer, String> result = cmdExecutor.execute(cmd); + String output = result.getSecond(); + FileUtils.writeStringToFile(new File(destDirFile, filename), output); + } catch (Exception e) { + logger.warn("Failed to run command: " + cmd + ".", e); + } + } +} http://git-wip-us.apache.org/repos/asf/kylin/blob/79d1c6d5/tool/src/main/java/org/apache/kylin/tool/CubeMetaExtractor.java ---------------------------------------------------------------------- diff --git a/tool/src/main/java/org/apache/kylin/tool/CubeMetaExtractor.java b/tool/src/main/java/org/apache/kylin/tool/CubeMetaExtractor.java index 73eec0d..28f5e70 100644 --- a/tool/src/main/java/org/apache/kylin/tool/CubeMetaExtractor.java +++ b/tool/src/main/java/org/apache/kylin/tool/CubeMetaExtractor.java @@ -105,7 +105,7 @@ public class CubeMetaExtractor extends AbstractInfoExtractor { public CubeMetaExtractor() { super(); - packagePrefix = "cubemeta"; + packageType = "cubemeta"; OptionGroup realizationOrProject = new OptionGroup(); realizationOrProject.addOption(OPTION_CUBE); http://git-wip-us.apache.org/repos/asf/kylin/blob/79d1c6d5/tool/src/main/java/org/apache/kylin/tool/DiagnosisInfoCLI.java ---------------------------------------------------------------------- diff --git a/tool/src/main/java/org/apache/kylin/tool/DiagnosisInfoCLI.java b/tool/src/main/java/org/apache/kylin/tool/DiagnosisInfoCLI.java index 05285bd..bd88fe7 100644 --- a/tool/src/main/java/org/apache/kylin/tool/DiagnosisInfoCLI.java +++ b/tool/src/main/java/org/apache/kylin/tool/DiagnosisInfoCLI.java @@ -30,8 +30,6 @@ import org.apache.kylin.common.util.OptionsHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.io.Files; - public class DiagnosisInfoCLI extends AbstractInfoExtractor { private static final Logger logger = LoggerFactory.getLogger(DiagnosisInfoCLI.class); @@ -45,20 +43,20 @@ public class DiagnosisInfoCLI extends AbstractInfoExtractor { private static final Option OPTION_INCLUDE_HBASE = OptionBuilder.withArgName("includeHBase").hasArg().isRequired(false).withDescription("Specify whether to include hbase files to extract. Default true.").create("includeHBase"); @SuppressWarnings("static-access") - private static final Option OPTION_INCLUDE_LINUX = OptionBuilder.withArgName("includeLinux").hasArg().isRequired(false).withDescription("Specify whether to include os and linux kernel info to extract. Default true.").create("includeLinux"); + private static final Option OPTION_INCLUDE_CLIENT = OptionBuilder.withArgName("includeClient").hasArg().isRequired(false).withDescription("Specify whether to include client info to extract. Default true.").create("includeClient"); private KylinConfig kylinConfig; public DiagnosisInfoCLI() { super(); - packagePrefix = "diagnosis"; + packageType = "diagnosis"; kylinConfig = KylinConfig.getInstanceFromEnv(); options.addOption(OPTION_PROJECT); options.addOption(OPTION_INCLUDE_CONF); options.addOption(OPTION_INCLUDE_HBASE); - options.addOption(OPTION_INCLUDE_LINUX); + options.addOption(OPTION_INCLUDE_CLIENT); } public static void main(String args[]) { @@ -71,7 +69,7 @@ public class DiagnosisInfoCLI extends AbstractInfoExtractor { final String project = optionsHelper.getOptionValue(options.getOption("project")); boolean includeConf = optionsHelper.hasOption(OPTION_INCLUDE_CONF) ? Boolean.valueOf(optionsHelper.getOptionValue(OPTION_INCLUDE_CONF)) : true; boolean includeHBase = optionsHelper.hasOption(OPTION_INCLUDE_HBASE) ? Boolean.valueOf(optionsHelper.getOptionValue(OPTION_INCLUDE_HBASE)) : true; - boolean includeLinux = optionsHelper.hasOption(OPTION_INCLUDE_LINUX) ? Boolean.valueOf(optionsHelper.getOptionValue(OPTION_INCLUDE_LINUX)) : true; + boolean includeClient = optionsHelper.hasOption(OPTION_INCLUDE_CLIENT) ? Boolean.valueOf(optionsHelper.getOptionValue(OPTION_INCLUDE_CLIENT)) : true; // export cube metadata String[] cubeMetaArgs = { "-destDir", new File(exportDir, "metadata").getAbsolutePath(), "-project", project, "-compress", "false", "-quiet", "false" }; @@ -95,27 +93,11 @@ public class DiagnosisInfoCLI extends AbstractInfoExtractor { } } - // export os (linux) - if (includeLinux) { - File linuxDir = new File(exportDir, "linux"); - FileUtils.forceMkdir(linuxDir); - File transparentHugepageCompactionDir = new File(linuxDir, "transparent_hugepage"); - FileUtils.forceMkdir(transparentHugepageCompactionDir); - File vmSwappinessDir = new File(linuxDir, "vm.swappiness"); - FileUtils.forceMkdir(vmSwappinessDir); - try { - String transparentHugepageCompactionPath = "/sys/kernel/mm/transparent_hugepage/defrag"; - Files.copy(new File(transparentHugepageCompactionPath), new File(transparentHugepageCompactionDir, "defrag")); - } catch (Exception e) { - logger.warn("Error in export transparent hugepage compaction status.", e); - } - - try { - String vmSwapinessPath = "/proc/sys/vm/swappiness"; - Files.copy(new File(vmSwapinessPath), new File(vmSwappinessDir, "swappiness")); - } catch (Exception e) { - logger.warn("Error in export vm swapiness.", e); - } + // export client + if (includeClient) { + String[] clientArgs = { "-destDir", new File(exportDir, "client").getAbsolutePath(), "-compress", "false", "-quiet", "false" }; + ClientEnvExtractor clientEnvExtractor = new ClientEnvExtractor(); + clientEnvExtractor.execute(clientArgs); } // export commit id @@ -129,11 +111,7 @@ public class DiagnosisInfoCLI extends AbstractInfoExtractor { try { File basicDir = new File(exportDir, "basic"); FileUtils.forceMkdir(basicDir); - String output = kylinConfig.getCliCommandExecutor().execute("ps -ef|grep kylin").getSecond(); - FileUtils.writeStringToFile(new File(basicDir, "process"), output); - output = kylinConfig.getCliCommandExecutor().execute("lsb_release -a").getSecond(); - FileUtils.writeStringToFile(new File(basicDir, "lsb_release"), output); - output = KylinVersion.getKylinClientInformation(); + String output = KylinVersion.getKylinClientInformation(); FileUtils.writeStringToFile(new File(basicDir, "client"), output + "\n"); output = ToolUtil.getHBaseMetaStoreId(); FileUtils.writeStringToFile(new File(basicDir, "client"), output, true); http://git-wip-us.apache.org/repos/asf/kylin/blob/79d1c6d5/tool/src/main/java/org/apache/kylin/tool/JobDiagnosisInfoCLI.java ---------------------------------------------------------------------- diff --git a/tool/src/main/java/org/apache/kylin/tool/JobDiagnosisInfoCLI.java b/tool/src/main/java/org/apache/kylin/tool/JobDiagnosisInfoCLI.java index 63b71d2..85fd539 100644 --- a/tool/src/main/java/org/apache/kylin/tool/JobDiagnosisInfoCLI.java +++ b/tool/src/main/java/org/apache/kylin/tool/JobDiagnosisInfoCLI.java @@ -52,6 +52,9 @@ public class JobDiagnosisInfoCLI extends AbstractInfoExtractor { @SuppressWarnings("static-access") private static final Option OPTION_INCLUDE_YARN_LOGS = OptionBuilder.withArgName("includeYarnLogs").hasArg().isRequired(false).withDescription("set this to true if want to extract related yarn logs too. Default true").create("includeYarnLogs"); + @SuppressWarnings("static-access") + private static final Option OPTION_INCLUDE_CLIENT = OptionBuilder.withArgName("includeClient").hasArg().isRequired(false).withDescription("Specify whether to include client info to extract. Default true.").create("includeClient"); + private KylinConfig kylinConfig; private ExecutableDao executableDao; @@ -61,10 +64,11 @@ public class JobDiagnosisInfoCLI extends AbstractInfoExtractor { public JobDiagnosisInfoCLI() { super(); - packagePrefix = "job"; + packageType = "job"; options.addOption(OPTION_JOB_ID); options.addOption(OPTION_INCLUDE_CUBE); + options.addOption(OPTION_INCLUDE_CLIENT); options.addOption(OPTION_INCLUDE_YARN_LOGS); kylinConfig = KylinConfig.getInstanceFromEnv(); @@ -76,7 +80,9 @@ public class JobDiagnosisInfoCLI extends AbstractInfoExtractor { String jobId = optionsHelper.getOptionValue(OPTION_JOB_ID); boolean includeCube = optionsHelper.hasOption(OPTION_INCLUDE_CUBE) ? Boolean.valueOf(optionsHelper.getOptionValue(OPTION_INCLUDE_CUBE)) : true; boolean includeYarnLogs = optionsHelper.hasOption(OPTION_INCLUDE_YARN_LOGS) ? Boolean.valueOf(optionsHelper.getOptionValue(OPTION_INCLUDE_YARN_LOGS)) : true; + boolean includeClient = optionsHelper.hasOption(OPTION_INCLUDE_CLIENT) ? Boolean.valueOf(optionsHelper.getOptionValue(OPTION_INCLUDE_CLIENT)) : true; + // dump job output ExecutablePO executablePO = executableDao.getJob(jobId); addRequired(ExecutableDao.pathOfJob(jobId)); addRequired(ExecutableDao.pathOfJobOutput(jobId)); @@ -87,9 +93,9 @@ public class JobDiagnosisInfoCLI extends AbstractInfoExtractor { yarnLogsResources.add(task.getUuid()); } } - extractResources(exportDir); + // dump cube metadata if (includeCube) { String cubeName = executablePO.getParams().get("cubeName"); if (!StringUtils.isEmpty(cubeName)) { @@ -103,6 +109,7 @@ public class JobDiagnosisInfoCLI extends AbstractInfoExtractor { } } + // dump yarn logs if (includeYarnLogs) { logger.info("Start to related yarn job logs: " + jobId); File yarnLogDir = new File(exportDir, "yarn"); @@ -112,6 +119,12 @@ public class JobDiagnosisInfoCLI extends AbstractInfoExtractor { } } + if (includeClient) { + String[] clientArgs = { "-destDir", new File(exportDir, "client").getAbsolutePath(), "-compress", "false", "-quiet", "false" }; + ClientEnvExtractor clientEnvExtractor = new ClientEnvExtractor(); + clientEnvExtractor.execute(clientArgs); + } + // export kylin logs String[] logsArgs = { "-destDir", new File(exportDir, "logs").getAbsolutePath(), "-compress", "false", "-quiet", "false" }; KylinLogExtractor logExtractor = new KylinLogExtractor(); http://git-wip-us.apache.org/repos/asf/kylin/blob/79d1c6d5/tool/src/main/java/org/apache/kylin/tool/KylinLogExtractor.java ---------------------------------------------------------------------- diff --git a/tool/src/main/java/org/apache/kylin/tool/KylinLogExtractor.java b/tool/src/main/java/org/apache/kylin/tool/KylinLogExtractor.java index 18a915d..5351c92 100644 --- a/tool/src/main/java/org/apache/kylin/tool/KylinLogExtractor.java +++ b/tool/src/main/java/org/apache/kylin/tool/KylinLogExtractor.java @@ -43,7 +43,7 @@ public class KylinLogExtractor extends AbstractInfoExtractor { public KylinLogExtractor() { super(); - packagePrefix = "logs"; + packageType = "logs"; options.addOption(OPTION_LOG_PERIOD); } http://git-wip-us.apache.org/repos/asf/kylin/blob/79d1c6d5/tool/src/main/java/org/apache/kylin/tool/ToolUtil.java ---------------------------------------------------------------------- diff --git a/tool/src/main/java/org/apache/kylin/tool/ToolUtil.java b/tool/src/main/java/org/apache/kylin/tool/ToolUtil.java index 982e388..24a7a37 100644 --- a/tool/src/main/java/org/apache/kylin/tool/ToolUtil.java +++ b/tool/src/main/java/org/apache/kylin/tool/ToolUtil.java @@ -52,4 +52,5 @@ public class ToolUtil { return "MetaStore UUID: " + desc.getValue(HBaseConnection.HTABLE_UUID_TAG); } } + }