详解Hive-Driver——细读Hive源码(四)

接着上一篇来说执行入口的分析,CliDriver最终将用户指令cmd提交给了Driver的run方法(针对常用查询语句而言),在这里用户的cmd将会被编译,优化并生成MapReduce任务进行执行。
这里写图片描述
所以Driver也是Hive的核心,他扮演了一个将用户查询和MapReduce Task转换并执行的角色,下来我们就来看看Driver是如何实现的?

  1. run函数:
 public CommandProcessorResponse run(String command, boolean alreadyCompiled)
        throws CommandNeedRetryException {
    CommandProcessorResponse cpr = runInternal(command, alreadyCompiled);
    if(cpr.getResponseCode() == 0) {
      return cpr;
    }
    SessionState ss = SessionState.get();
    if(ss == null) {
      return cpr;
    }
    .
    .
    .

run函数通过调用runInternal方法处理用户指令,在处理完成runInternal之后,如果执行过程中出现出错,还附加了对错误码和错误信息的处理,省略的部分就是错误的处理
在run函数中调用了runInternal,这也就是run函数的核心内容
2. 既然runInternal是核心内容,后面我们将逐步分析此函数
(1)
这里写图片描述
在这里先做了一个检测,确认在配置文件中HIVE_HADOOP_SUPPORTS_SUBDIRECTORIES等等的属性无误,否则报错。

这里写图片描述

这个就是return的值中实现的内容,返回了一个类,并在返回的过程中给类中的一些变量赋值。

(2)

 HiveDriverRunHookContext hookContext = new HiveDriverRunHookContextImpl(conf, command);
    // Get all the driver run hooks and pre-execute them.
    List<HiveDriverRunHook> driverRunHooks;
    try {
      driverRunHooks = getHooks(HiveConf.ConfVars.HIVE_DRIVER_RUN_HOOKS,
          HiveDriverRunHook.class);
      for (HiveDriverRunHook driverRunHook : driverRunHooks) {
          driverRunHook.preDriverRun(hookContext);
      }
    } catch (Exception e) {
      errorMessage = "FAILED: Hive Internal Error: " + Utilities.getNameMessage(e);
      SQLState = ErrorMsg.findSQLState(e.getMessage());
      downstreamError = e;
      console.printError(errorMessage + "\n"
          + org.apache.hadoop.util.StringUtils.stringifyException(e));
      return createProcessorResponse(12);
    }

首先根据配置文件和指令,构造用户Hook执行的上下文hookContext,然后读取用户PreRunHook配置指定的类(字符串),此配置项对应于Hive配置文件当中的“hive.exec.driver.run.hooks”一项,利用反射机制Class.forName实例化PreRunHook类实例(getHook函数完成),依次执行各钩子的功能(preDriverRun 函数完成)。
——-待完善

(3)
这里写图片描述

直接调用complieInternal函数编译用户指令,将指令翻译成MapReduce任务。在这里要解释一下 :synchronized (compileMonitor)是为了compileMonitor加上了同步锁,并且这个compileMonitor还仅为可读的。——-这里Monitor是一个空的对象,加上了同步锁,能起到什么样的作用呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值