设为首页 加入收藏

TOP

详解Hive-Driver——细读Hive源码(四)
2018-12-04 17:14:02 】 浏览:98
Tags:详解 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是一个空的对象,加上了同步锁,能起到什么样的作用呢?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇详解hive的列分隔符和行分隔符的.. 下一篇Hive实战   函数Find_in_set

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目