使用 start(SessionState)在多个会话之间切换。这两者的主要逻辑类似,以 start(HiveConf)为例:
1. 使用参数 hiveconf 创建一个新的 SessionState 对象,主要是将 hiveconf 保存在新的
SessionState 对象中;
2. 构造一个新的 session id,并将它设置在 SessionState 对象的 HiveConf 对象中;
3. 初始化 SessionState 对象的 HiveHistory 、 HiveAuthenticationProvider、
HiveAuthorizationProvider 对象;
4. 将该 SessionState 对象设置到线程局部变量中,对应于该线程;
命令处理器
如前文所述,每一个 HQL 的命令都是由 CommandProcessor 处理的。这些命令处理器的框
架代码在 ql.processors 包中。
CommandProcessor 本身是一个 Java 接口,该接口定义了两个方法:
1. public void init():完成该 processor 的初始化;
2. public CommandProcessorResponse run(String cmd):执行一个命令,并返回执行结
果。
CommandProcessorResponse 类封装了几个基本的命令执行结果信息,包括整型的
responseCode , 字符串型的 errorMessage 和 SQLState。一般情况下,后两者只是在
responseCode 不为 0 的时候提供更多的可读信息。
在 ql.processors 包中,另一个接口类是 CommandProcessorFactory,如前文所述,这个
类会根据要处理的命令的第一个 token 去创建一个对应的 CommandProcessor 子类。对应关系如下
表所示。
命令起始 token CommandProcessor
描述
“set” SetProcessor 读取/设置当前会话的一些属性,如 HiveConf 中
的那些属性。
“dfs” DfsProcessor 运行一个 DFS 的命令,如 ls,cat。
“add” AddProcessor 为当前会话增加资源,如自定义的 jar 包。
“delete” DeleteProcessor
在当前会话中删除指定的资源。
其它
ql.Driver 完成所有 HQL 语句,这是真正的 Hive Query
Engine 的驱动。里面包含了编译/执行的过程。
HQL 可能操作元数据,也可能操作 hdfs 上的表
数据。
从上表可以看出,Driver 是处理 HQL 的驱动,也是 QE 的入口/驱动。每个 Driver 对象其实
对应于一个 HiveConf。在 CommandProcessorFactory 中维护了一个 lazy 填充的
Map<HiveConf, Driver>对象。如果在 get()的时候指定的 HiveConf 为 null,则新创建一个
Driver 对象并返回它。否则,先在 Map 中找,若找到,返回对应的 Driver 对象;若没有找到,则创
建一个 Driver,init 它,放入 Map,并返回它。