03. Hive源码 — Driver中的run方法

上一节分析了Hive中跟处理表中数据相关的SQL都是通过Driver中run方法执行的,这一节就主要看一下Driver中的run方法。

1. run方法

从Driver中的run方法中可以看出最终执行的是 runInternal 这个方法,以下是这个方法中的主要的代码:

private CommandProcessorResponse runInternal(String command, boolean alreadyCompiled)
    .........
    // 第一部分:hook这边的设计可以允许Hive扩展自定义处理命令的逻辑(在解析sql前的执行)
    HiveDriverRunHookContext hookContext = new HiveDriverRunHookContextImpl(conf, alreadyCompiled ? ctx.getCmd() : command);
    List<HiveDriverRunHook> driverRunHooks;
    driverRunHooks = getHooks(HiveConf.ConfVars.HIVE_DRIVER_RUN_HOOKS, HiveDriverRunHook.class);
    for (HiveDriverRunHook driverRunHook : driverRunHooks) {
          driverRunHook.preDriverRun(hookContext);
    }
    .........

    // 第二部分:通过方法compileInternal对sql语句进行编译
    int ret;
    ret = compileInternal(command, true);
    .........
  
    // 第三部分:初始化Hive中管理transaction的接口对象,对 autoCommit 、rollback等情况进行处理
    HiveTxnManager txnManager = SessionState.get().getTxnMgr();
    ctx.setHiveTxnManager(txnManager);
    ......

    // 第四部分:真正开始执行    
    ret = execute(true);
    .........
    
    // 第五部分:允许Hive扩展自定义处理命令的逻辑(在执行完sql后的执行)
      for (HiveDriverRunHook driverRunHook : driverRunHooks) {
          driverRunHook.postDriverRun(hookContext);
      }
     .........

runInternal主要有5大部分的内容:
头和尾是可以允许扩展自定义处理命令的逻辑,在sql解析前和执行后运行;
第三部分主要是处理一些事务相关的逻辑;
sql的解析和执行是最主要的内容,所以重点关注 compileInternalexecute 方法

2. sql的解析 — compileInternal方法

主要代码如下,主要执行了 compile 中的方法,下一节讲compile方法:

private int compileInternal(String command, boolean deferClose) {
  int ret;
  ........
  ret = compile(command, true, deferClose);
  ......
  return ret;
}

3. 小结

从Driver中的run方法可以看出Hive中SQL的执行主要分两步,第一步先对SQL进行解析,第二步执行解析后的SQL,下两节主要看这两大部分。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。