@SuppressWarnings("unchecked")
  public static void main(String[] args) throws IOException, HiveException {

    String planFileName = null;
    String jobConfFileName = null;
    boolean noLog = false;
    String files = null;
    String libjars = null;
    boolean localtask = false;
    try {
      for (int i = 0; i < args.length; i++) {
        if (args[i].equals("-plan")) {
          planFileName = args[++i];
        } else if (args[i].equals("-jobconffile")) {
          jobConfFileName = args[++i];
        } else if (args[i].equals("-nolog")) {
          noLog = true;
        } else if (args[i].equals("-files")) {
          files = args[++i];
        } else if (args[i].equals("-libjars")) {
          libjars = args[++i];
        }else if (args[i].equals("-localtask")) {
          localtask = true;
        }
      }
    } catch (IndexOutOfBoundsException e) {
      System.err.println("Missing argument to option");
      printUsage();
    }

    JobConf conf;
    if (localtask) {
      conf = new JobConf(MapredLocalTask.class);
    } else {
      conf = new JobConf(ExecDriver.class);
    }

    if (jobConfFileName != null) {
      conf.addResource(new Path(jobConfFileName));
    }

    // Initialize the resources from command line
    if (files != null) {
      conf.set("tmpfiles", files);
    }

    if (libjars != null) {
      conf.set("tmpjars", libjars);
    }

    if(UserGroupInformation.isSecurityEnabled()){
      String hadoopAuthToken = System.getenv(UserGroupInformation.HADOOP_TOKEN_FILE_LOCATION);
      if(hadoopAuthToken != null){
        conf.set("mapreduce.job.credentials.binary", hadoopAuthToken);
      }
    }

    boolean isSilent = HiveConf.getBoolVar(conf, HiveConf.ConfVars.HIVE_SESSION_SILENT);

    String queryId = HiveConf.getVar(conf, HiveConf.ConfVars.HIVE_QUERY_ID, "").trim();
    if(queryId.isEmpty()) {
      queryId = "unknown-" + System.currentTimeMillis();
      HiveConf.setVar(conf, HiveConf.ConfVars.HIVE_QUERY_ID, queryId);
    }
    System.setProperty(HiveConf.ConfVars.HIVE_QUERY_ID.toString(), queryId);

    LogUtils.registerLoggingContext(conf);

    if (noLog) {
      // If started from main(), and noLog is on, we should not output
      // any logs. To turn the log on, please set -Dtest.silent=false
      org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager.getRootLogger();
      NullAppender appender = NullAppender.createNullAppender();
      appender.addToLogger(logger.getName(), Level.ERROR);
      appender.start();
    } else {
      setupChildLog4j(conf);
    }

    Logger LOG = LoggerFactory.getLogger(ExecDriver.class.getName());
    LogHelper console = new LogHelper(LOG, isSilent);

    if (planFileName == null) {
      console.printError("Must specify Plan File Name");
      printUsage();
    }

    // print out the location of the log file for the user so
    // that it's easy to find reason for local mode execution failures
    for (Appender appender : ((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger())
            .getAppenders().values()) {
      if (appender instanceof FileAppender) {
        console.printInfo("Execution log at: " + ((FileAppender) appender).getFileName());
      } else if (appender instanceof RollingFileAppender) {
        console.printInfo("Execution log at: " + ((RollingFileAppender) appender).getFileName());
      }
    }

    // the plan file should always be in local directory
    Path p = new Path(planFileName);
    FileSystem fs = FileSystem.getLocal(conf);
    InputStream pathData = fs.open(p);

    // this is workaround for hadoop-17 - libjars are not added to classpath of the
    // child process. so we add it here explicitly
    try {
      // see also - code in CliDriver.java
      ClassLoader loader = conf.getClassLoader();
      if (StringUtils.isNotBlank(libjars)) {
        AddToClassPathAction addAction = new AddToClassPathAction(
            loader, Arrays.asList(StringUtils.split(libjars, ",")));
        loader = AccessController.doPrivileged(addAction);
      }
      conf.setClassLoader(loader);
      // Also set this to the Thread ContextClassLoader, so new threads will
      // inherit
      // this class loader, and propagate into newly created Configurations by
      // those
      // new threads.
      Thread.currentThread().setContextClassLoader(loader);
    } catch (Exception e) {
      throw new HiveException(e.getMessage(), e);
    }
    int ret;
    if (localtask) {
      memoryMXBean = ManagementFactory.getMemoryMXBean();
      MapredLocalWork plan = SerializationUtilities.deserializePlan(pathData, MapredLocalWork.class);
      MapredLocalTask ed = new MapredLocalTask(plan, conf, isSilent);
      ed.initialize(null, null, new TaskQueue(), null);
      ret = ed.executeInProcess();

    } else {
      MapredWork plan = SerializationUtilities.deserializePlan(pathData, MapredWork.class);
      ExecDriver ed = new ExecDriver(plan, conf, isSilent);
      ed.setTaskQueue(new TaskQueue());
      ret = ed.execute();
    }

    if (ret != 0) {
      System.exit(ret);
    }
  }
we are running the hadoop job via a sub-command. this typically happens when we are running
jobs in local mode. the log4j in this mode is controlled as follows: 1. if the admin provides a
log4j properties file especially for execution mode - then we pick that up 2. otherwise - we
default to the regular hive log4j properties if one is supplied 3. if none of the above two
apply - we don't do anything - the log4j properties would likely be determined by hadoop.

The intention behind providing a separate option #1 is to be able to collect hive run time logs
generated in local mode in a separate (centralized) location if desired. This mimics the
behavior of hive run time logs when running against a hadoop cluster where they are available
on the tasktracker nodes.
ql/src/java/org/apache/hadoop/hive/ql/exec/mr/ExecDriver.java