0
点赞
收藏
分享

微信扫一扫

Hive3.1.2源码阅读--提交任务executeDriver

小_北_爸 2022-03-16 阅读 49
hivejava
  1. 由上文可知,客户端的驱动工作是在executeDriver中进行的
    调用该方法时传入了三个参数:
    1.1 ss hiveconf用户配置
    1.2 conf hiveconf默认配置
    1.3 oproc 用户环境配置
    在这里插入图片描述
  2. ctrl+左键进入该方法中
    2.1 首先根据前面解析出来的参数,将对应的参数值封装到CliDriver对象中
    2.2 如果是-e的执行方式,则直接执行后面的sql语句;如果是-h的执行方式,则执行对应的sql脚本文件
    2.3 如果执行引擎是mapreduce的话,则输出一些告警信息(hive3.X版本不建议使用mr程序而发出的警告),当前版本的hive支持mr、tez、spark三种引擎
    2.4 解析出对应的sql语句(按分号分割出不同语句先后执行,同时忽略了注释)
    2.5 每次解析出一条完整的语句时,开始进入processline方法中进行执行
    在这里插入图片描述
  private int executeDriver(CliSessionState ss, HiveConf conf, OptionsProcessor oproc)
      throws Exception {
    // 1.创建cli对象
    CliDriver cli = new CliDriver();
    // 将 -e 后的参数封装进cli(命令行执行的sql语句)
    cli.setHiveVariables(oproc.getHiveVariables());

    // 将 -database 后的参数封装进cli(数据库选项)
    cli.processSelectDatabase(ss);

    // 将 -i 后的参数封装进,如果未指定则加载.hiverc文件
    cli.processInitFiles(ss);
    // 2.如果hive -e后有参数(sql语句),则执行sql语句
    if (ss.execString != null) {
      int cmdProcessStatus = cli.processLine(ss.execString);
      return cmdProcessStatus;
    }
    // 如果hive -h后有参数(sql脚本文件),则执行脚本文件
    try {
      if (ss.fileName != null) {
        return cli.processFile(ss.fileName);
      }
    } catch (FileNotFoundException e) {
      System.err.println("Could not open input file for reading. (" + e.getMessage() + ")");
      return 3;
    }
    // 3.如果是设定了执行引擎是mr,则告警提示
    if ("mr".equals(HiveConf.getVar(conf, ConfVars.HIVE_EXECUTION_ENGINE))) {
      console.printInfo(HiveConf.generateMrDeprecationWarning());//hive3.X版本不建议使用mr程序而发出的警告
    }

    // 初始化控制台用于接收语句
    setupConsoleReader();

    String line;
    int ret = 0;//正常的返回值
    String prefix = "";
    // 4.进入默认的库中
    String curDB = getFormattedDb(conf, ss);
    String curPrompt = prompt + curDB;
    // 将字符串替换为空格
    String dbSpaces = spacesForString(curDB);
    // 5.这里是一个while循环,直到遇到分号的时候才执行命令。
    while ((line = reader.readLine(curPrompt + "> ")) != null) {
      // 换行
      if (!prefix.equals("")) {
        prefix += '\n';
      }
      // 忽略使用 -- 开头的行
      if (line.trim().startsWith("--")) {//跳过注释
        continue;
      }
      // 判断line是否以分号结尾,同时不以\\;(被注释)结尾
      if (line.trim().endsWith(";") && !line.trim().endsWith("\\;")) {
        line = prefix + line;
        //  提交sql语句,开始执行hive命令
        ret = cli.processLine(line, true);
        prefix = "";
        curDB = getFormattedDb(conf, ss);
        curPrompt = prompt + curDB;
        dbSpaces = dbSpaces.length() == curDB.length() ? dbSpaces : spacesForString(curDB);
      } else {
        prefix = prefix + line;
        curPrompt = prompt2 + dbSpaces;
        continue;
      }
    }

    return ret;
  }
举报

相关推荐

0 条评论