PostExPerformanceDiagnoser.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:10k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.vaidya.postexdiagnosis;
  19. import java.net.URL;
  20. import java.io.InputStream;
  21. import java.io.FileInputStream;
  22. import org.apache.hadoop.fs.FileSystem;
  23. import org.apache.hadoop.mapred.JobConf;
  24. import org.apache.hadoop.mapred.JobHistory.JobInfo;
  25. import org.apache.hadoop.mapred.DefaultJobHistoryParser;
  26. import org.apache.hadoop.vaidya.util.XMLUtils;
  27. import org.apache.hadoop.vaidya.DiagnosticTest;
  28. import org.apache.hadoop.vaidya.JobDiagnoser;
  29. import org.apache.hadoop.vaidya.statistics.job.JobStatistics;
  30. import org.w3c.dom.NodeList;
  31. import org.w3c.dom.Document;
  32. import org.w3c.dom.Element;
  33. /**
  34.  * This class acts as a driver or rule engine for executing the post execution 
  35.  * performance diagnostics tests of a map/reduce job. It prints or saves the 
  36.  * diagnostic report as a xml document. 
  37.  */
  38. public class PostExPerformanceDiagnoser extends JobDiagnoser {
  39.   
  40.   private String _jobHistoryFile = null;
  41.   private InputStream _testsConfFileIs = null;
  42.   private String _reportFile = null;
  43.   private String _jobConfFile = null;
  44.   /* 
  45.    * Data available for analysts to write post execution performance diagnostic rules 
  46.    */
  47.   private JobStatistics _jobExecutionStatistics;
  48.   
  49.   /*
  50.    * Get the report file where diagnostic report is to be saved
  51.    */
  52.   public String getReportFile () {
  53.     return this._reportFile;
  54.   }
  55.   
  56.   /*
  57.    * Get the job history log file used in collecting the job counters
  58.    */
  59.   public String getJobHistoryFile () {
  60.     return this._jobHistoryFile;
  61.   }
  62.   
  63.   /*
  64.    * Get the test configuration file where all the diagnostic tests are registered
  65.    * with their configuration information.
  66.    */
  67.   public InputStream getTestsConfFileIs () {
  68.     return  this._testsConfFileIs;
  69.   }
  70.     
  71.   /*
  72.    * Set the test configuration file
  73.    */
  74.   public void setTestsConfFileIs (InputStream testsConfFileIs) {
  75.     this._testsConfFileIs = testsConfFileIs;
  76.   }
  77.   
  78.   /**
  79.    * @return JobStatistics - Object storing the job configuration and execution
  80.    * counters and statistics information
  81.    */
  82.   public JobStatistics getJobExecutionStatistics() {
  83.     return _jobExecutionStatistics;
  84.   }
  85.   /**
  86.    * @param jobConfFile - URL pointing to job configuration (job_conf.xml) file
  87.    * @param jobHistoryLogFile - URL pointing to job history log file  
  88.    * @param testsConfFile - file path for test configuration file (optional). 
  89.    * If not specified default path is:$HADOOP_HOME/contrib/vaidya/pxpd_tests_config.xml
  90.    * @param reportFile - file path for storing report (optional)
  91.    */
  92.   public PostExPerformanceDiagnoser (String jobConfFile, String jobHistoryFile, InputStream testsConfFileIs,
  93.                 String reportFile) throws Exception {
  94.     
  95.     this._jobHistoryFile = jobHistoryFile;
  96.     this._testsConfFileIs = testsConfFileIs;
  97.     this._reportFile = reportFile;
  98.     this._jobConfFile = jobConfFile;
  99.     
  100.     /*
  101.      * Read the job information necessary for post performance analysis
  102.      */
  103.     JobConf jobConf = new JobConf();
  104.     JobInfo jobInfo = new JobInfo("");
  105.     readJobInformation(jobConf, jobInfo);
  106.     this._jobExecutionStatistics = new JobStatistics(jobConf, jobInfo);
  107.   }
  108.   /**
  109.    * read and populate job statistics information.
  110.    */
  111.   private void readJobInformation(JobConf jobConf, JobInfo jobInfo) throws Exception {
  112.   
  113.     /*
  114.      * Convert the input strings to URL
  115.      */
  116.     URL jobConfFileUrl = new URL(this._jobConfFile);
  117.     URL jobHistoryFileUrl = new URL (this._jobHistoryFile);
  118.     
  119.     /*
  120.      * Read the Job Configuration from the jobConfFile url
  121.      */  
  122.     jobConf.addResource(jobConfFileUrl);
  123.     
  124.     /* 
  125.      * Read JobHistoryFile and build job counters to evaluate diagnostic rules
  126.      */
  127.     if (jobHistoryFileUrl.getProtocol().equals("hdfs")) {
  128.       DefaultJobHistoryParser.parseJobTasks (jobHistoryFileUrl.getPath(), jobInfo, FileSystem.get(jobConf));
  129.     } else if (jobHistoryFileUrl.getProtocol().equals("file")) {
  130.       DefaultJobHistoryParser.parseJobTasks (jobHistoryFileUrl.getPath(), jobInfo, FileSystem.getLocal(jobConf));
  131.     } else {
  132.       throw new Exception("Malformed URL. Protocol: "+jobHistoryFileUrl.getProtocol());
  133.     }
  134.   }
  135.   
  136.   /*
  137.    * print Help
  138.    */
  139.   private static void printHelp() {
  140.     System.out.println("Usage:");
  141.     System.out.println("PostExPerformanceDiagnoser -jobconf <fileurl> -joblog <fileurl> [-testconf <filepath>] [-report <filepath>]");
  142.     System.out.println();
  143.     System.out.println("-jobconf <fileurl>     : File path for job configuration file (e.g. job_xxxx_conf.xml). It can be on HDFS or");
  144.     System.out.println("                       : local file system. It should be specified in the URL format.");
  145.     System.out.println("                       : e.g. local file => file://localhost/Users/hadoop-user/job_0001_conf.xml");
  146.     System.out.println("                       : e.g. hdfs file  => hdfs://namenode:port/Users/hadoop-user/hodlogs/.../job_0001_conf.xml");
  147.     System.out.println();
  148.     System.out.println("-joblog <fileurl>      : File path for job history log file. It can be on HDFS or local file system.");
  149.     System.out.println("                       : It should be specified in the URL format.");
  150.     System.out.println();
  151.     System.out.println("-testconf <filepath>   : Optional file path for performance advisor tests configuration file. It should be available");
  152.     System.out.println("                       : on local file system and be specified as as an absolute file path.");
  153.     System.out.println("                       : e.g. => /Users/hadoop-user/postex_diagnosis_tests.xml. If not specified default file will be used");
  154.     System.out.println("                       : from the hadoop-{ver}-vaidya.jar in a classpath.");
  155.     System.out.println("                       : For user to view or make local copy of default tests, file is available at $HADOOP_HOME/contrib/vaidya/conf/postex_diagnosis_tests.xml");
  156.     System.out.println();
  157.     System.out.println("-report <filepath>     : Optional file path for for storing diagnostic report in a XML format. Path should be available");
  158.     System.out.println("                       : on local file system and be specified as as an absolute file path.");
  159.     System.out.println("                       : e.g. => /Users/hadoop-user/postex_diagnosis_report.xml. If not specified report will be printed on console");
  160.     System.out.println();
  161.     System.out.println("-help                  : prints this usage");
  162.     System.out.println();
  163.   }
  164.   
  165.   /**
  166.    * @param args
  167.    */
  168.   public static void main(String[] args) {
  169.     
  170.     String jobconffile = null;
  171.     String joblogfile = null;
  172.     InputStream testsconffileis = null;
  173.     String reportfile = null; 
  174.     
  175.     /*
  176.      * Parse the command line arguments
  177.      */
  178.     try {
  179.       for (int i=0; i<args.length-1; i=i+2) {
  180.         if (args[i].equalsIgnoreCase("-jobconf")) {
  181.           jobconffile = args[i+1];
  182.         } else if (args[i].equalsIgnoreCase("-joblog")) {
  183.           joblogfile = args[i+1];
  184.         } else if (args[i].equalsIgnoreCase("-testconf")) {
  185.           testsconffileis = new FileInputStream(new java.io.File(args[i+1]));
  186.         } else if (args[i].equalsIgnoreCase("-report")) {
  187.           reportfile = args[i+1];
  188.         } else if (args[i].equalsIgnoreCase("-help")) {
  189.           printHelp(); return;
  190.         } else {
  191.           printHelp(); return;
  192.         }
  193.       }
  194.     } catch (Exception e) {
  195.       System.out.println ("Invalid arguments.");
  196.       e.printStackTrace();
  197.       System.out.println();
  198.       printHelp();
  199.     }
  200.     
  201.     // Check if required arguments are specified
  202.     if (jobconffile == null || joblogfile  == null) {
  203.       System.out.println ("Invalid arguments: -jobconf or -joblog arguments are missing");
  204.       printHelp();
  205.       return;
  206.     }
  207.     
  208.     try {
  209.       /*
  210.        * Create performance advisor and read job execution statistics
  211.        */
  212.       PostExPerformanceDiagnoser pa = new PostExPerformanceDiagnoser(jobconffile,joblogfile,testsconffileis,reportfile);
  213.       
  214.       /*
  215.        * Read the diagnostic tests configuration file (xml)
  216.        */
  217.       if (pa.getTestsConfFileIs() == null) {
  218.         java.io.InputStream testsconfis = Thread.currentThread().getContextClassLoader().getResourceAsStream("postex_diagnosis_tests.xml");
  219.         pa.setTestsConfFileIs(testsconfis);
  220.       }
  221.       
  222.       /*
  223.        * Parse the tests configuration file
  224.        */
  225.       Document rulesDoc = XMLUtils.parse(pa.getTestsConfFileIs());
  226.       
  227.       /* 
  228.        * Read the diagnostic rule entries from the config file.
  229.        * For every rule read and load the rule class name
  230.        * Execute the Run() method of the class and get the report element
  231.        */
  232.       NodeList list = rulesDoc.getElementsByTagName("DiagnosticTest");
  233.       int list_size = list.getLength();
  234.       for (int i=0;i<list_size; i++) {
  235.         Element dRule = (Element)list.item(i);
  236.         NodeList cNodeList = dRule.getElementsByTagName("ClassName");
  237.         Element cn = (Element)cNodeList.item(0);
  238.         String className = cn.getFirstChild().getNodeValue().trim();
  239.         Class rc = Class.forName(className);
  240.         DiagnosticTest test = (DiagnosticTest)rc.newInstance();
  241.         test.initGlobals(pa.getJobExecutionStatistics(), (Element)list.item(i));
  242.         test.run();
  243.         NodeList nodelist = pa.getReport().getElementsByTagName("PostExPerformanceDiagnosticReport");
  244.         Element root = (Element)nodelist.item(0);
  245.         //root.appendChild(rule.getReportElement(pa.getReport(), root)); 
  246.         Element re = test.getReportElement(pa.getReport(), root);
  247.         //XMLUtils.printDOM(re);
  248.       } 
  249.       
  250.       //Optionally print or save the report
  251.       if (pa.getReportFile() == null) {
  252.         pa.printReport();
  253.       } else {
  254.         pa.saveReport(pa.getReportFile());
  255.       }
  256.     }catch (Exception e) {
  257.       System.out.print("Exception:"+e);
  258.       e.printStackTrace();
  259.     }
  260.   }
  261. }