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);
         }
     }
+
 }

Reply via email to