Package azkaban.jobs

Source Code of azkaban.jobs.AzkabanCommandLine

/*
* Copyright 2010 LinkedIn, Inc
*
* Licensed 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 azkaban.jobs;

import static java.util.Arrays.asList;

import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;

import joptsimple.OptionParser;
import joptsimple.OptionSet;
import joptsimple.OptionSpec;
import joptsimple.OptionException;

import org.apache.log4j.Logger;

import azkaban.app.PropsUtils;

import azkaban.common.utils.Props;

public class AzkabanCommandLine {

  private static Logger logger = Logger.getLogger(AzkabanCommandLine.class);

  /* option specs */
  private OptionSet options;
  private final OptionParser parser;
  private final String helpOpt = "help";
  private final OptionSpec<String> logDirOpt;
  private final OptionSpec<String> jobDirOpt;
  private final OptionSpec<String> configDirOpt;

  /* option values */
  private final File logDir;
  private final List<File> jobDirs;
  private final Props defaultProps;
  private final ClassLoader classloader;
  private final int numWorkPermits;

  public AzkabanCommandLine(String[] args) {
    this(new OptionParser(), args);
  }

  public AzkabanCommandLine(OptionParser parser, String[] args) {
    this.parser = parser;
    parser.acceptsAll(asList("h", helpOpt), "Print usage information");
    logDirOpt = parser.accepts("log-dir",
        "The directory to store log files.").withRequiredArg()
        .describedAs("dir");
    jobDirOpt = parser.acceptsAll(asList("j", "job-dir"),
        "A directory in which to find job definitions.")
        .withRequiredArg().describedAs("dir");
    configDirOpt = parser
        .acceptsAll(asList("c", "config-dir"),
            "A configuration directory for jobs, if seperate from the job directory.")
        .withRequiredArg().describedAs("dir");

    /* now parse options */
    try {
      this.options = parser.parse(args);
    } catch (OptionException e) {
      printHelpAndExit("Error parsing options: " + e.getMessage(),
          System.out);
    }

    if (options.has(logDirOpt))
      logDir = new File((String) options.valueOf(logDirOpt));
    else
      logDir = new File(System.getProperty("java.io.tmpdir"));

    jobDirs = new ArrayList<File>();
    for (String jobDir : options.valuesOf(jobDirOpt))
      jobDirs.add(new File(jobDir));

    if (options.has(configDirOpt)) {
      String confDir = options.valueOf(configDirOpt);
      logger.debug("Loading default properties from " + confDir);
      defaultProps = PropsUtils.loadPropsInDir(new File(confDir.trim()),
          ".properties", ".schema");
    } else {
      logger.debug("No configuration options given (missing -c option).");
      defaultProps = new Props();
    }

    numWorkPermits = defaultProps.getInt("total.work.permits",
        Integer.MAX_VALUE);
    classloader = getHadoopClassLoader();
  }

  private ClassLoader getHadoopClassLoader() {
    String hadoopHome = System.getenv("HADOOP_HOME");
    if (hadoopHome != null) {
      try {
        logger.debug("Adding config to classloader from HADOOP_HOME ("
            + hadoopHome + ").");
        return new URLClassLoader(new URL[] { new File(hadoopHome,
            "conf").toURI().toURL() }, CommandLineJobRunner.class
            .getClassLoader());
      } catch (MalformedURLException e) {
        throw new IllegalStateException("Invalid HADOOP_HOME: "
            + hadoopHome + " is not a valid URL.");
      }
    } else {
      logger.debug("No HADOOP_HOME set, using default classloader.");
      return CommandLineJobRunner.class.getClassLoader();
    }
  }

  public boolean hasHelp() {
    return options.has(helpOpt);
  }

  public File getLogDir() {
    return logDir;
  }

  public List<File> getJobDirs() {
    return jobDirs;
  }

  public Props getDefaultProps() {
    return defaultProps;
  }

  public ClassLoader getClassloader() {
    return classloader;
  }

  public int getNumWorkPermits() {
    return numWorkPermits;
  }

  public OptionSet getOptions() {
    return this.options;
  }

  public OptionParser getParser() {
    return this.parser;
  }

  public void printHelpAndExit(String message, PrintStream out) {
    out.println(message);
    try {
      parser.printHelpOn(out);
    } catch (IOException e) {
      e.printStackTrace();
    }
    System.exit(1);
  }

}
TOP

Related Classes of azkaban.jobs.AzkabanCommandLine

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.