概述
接着上一篇来说执行入口的分析,CliDriver最终将用户指令cmd提交给了Driver的run方法(针对常用查询语句而言),在这里用户的cmd将会被编译,优化并生成MapReduce任务进行执行。
所以Driver也是Hive的核心,他扮演了一个将用户查询和MapReduce Task转换并执行的角色,下来我们就来看看Driver是如何实现的?
- 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-Driver——细读Hive源码(四)的全部内容,希望文章能够帮你解决详解Hive-Driver——细读Hive源码(四)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复