上一节分析了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的解析和执行是最主要的内容,所以重点关注 compileInternal
和 execute
方法
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,下两节主要看这两大部分。