hive源码的入口是CliDriver类,这个类中的main方法调用了run方法执行我们的HQL语句,这一节简单地看一下run方法中主要执行了哪些重要代码。
run中的主要代码:
step1: 创建OptionsProcessor对象解析hive执行前的可选参数
step2: 创建CliSessionState对象ss,创建过程中会把hive配置文件中的一些配置参数加载进来
step3: 获取 HiveConf 对象 conf,并进行一些配置项的加载
step4: 执行 executeDriver 方法执行HQL语句
1. OptionsProcessor
这个类中主要比较重要的成员:
-
private final Options options = new Options();
这个变量维护了启动hive时的一些可选参数,主要有:
--database database
:指定数据库
-e 'quoted-query-string'
:执行指定的语句
-f <query-file>
:执行指定HQL文件
-i <init-query-file>
:执行hive的初始化文件(可以在文件中指定多个hive参数)
--hiveconf property=value
:设置hive执行时的参数
--define key=value 或者 -d key=value
:定义HQL语句中会用到的变量
--hivevar key=value
:定义HQL语句中会用到的变量
-S 或者 --silent
:不打印日志信息
-v 或者 --verbose
:输出执行的 HQL 语句到控制台
-H 或者 --help
:打印帮助信息
在构造这个类的对象的时候,这些可选参数就会被加入options成员变量。
案例:hive --database test --hivevar in='tmp_qinff' -d num=10 -e 'select * from ${in} limit ${num}'
-
方法 boolean process_stage1(String[] argv)
将hive命令读进来解析出 hiveconf 和通过 defile/hivevar 定义的一些变量 -
方法 boolean process_stage2(CliSessionState ss)
把各种hive执行时的可选参数存入 ss 对象
2. CliSessionState
继承SessionState,维护Session中的一些变量什么的
3. HiveConf
维护hive运行时的配置参数,当创建这个HiveConf的对象时,会加载默认的参数值,在run方法中,会用通过命令行设置的参数对这个对象维护的配置进行更新。所以通过命令行设置的参数最后生效。
4. executeDriver 方法
int executeDriver(CliSessionState ss, HiveConf conf, OptionsProcessor oproc)
这个方法中主要做的事情:
step1: 将启动 hive 时设置的 options 维护进 SessionState 对象
cli.setHiveVariables(oproc.getHiveVariables());step2: 如果有指定特定的数据库,则切换成对应的数据库
执行方法 cli.processSelectDatabase(ss);
其实就是通过方法 processLine 执行了 use ss.database; 语句-
step3: 执行 hive 初始化文件
执行方法 cli.processInitFiles(ss);
如果我们有通过 -i 指定初始化文件,则挨个对我们指定的初始化文件执行 processFile(initFile) 方法。
如果没有指定文件,则依次去目录 $HIVE_HOME/bin/ 、 $HIVE_CONF_DIR/ 、用户主目录下 找 .hiverc 文件,然后对其执行processFile(hivercDefault) 方法: 从以上的执行过程我们可以知道可以在
.hiverc
这个文件中配置一些常用的参数,在hive启动的时候自动执行。 step4: 执行通过 -e 指定的HQL语句
执行方法 int processLine(String line),然后整个executeDriver方法结束step5: 执行通过 -f 指定的 HQL 文件
执行方法 int processFile(String fileName),然后整个executeDriver方法结束step6: 如果不是 -e 或 -f 指定语句或文件,则从控制台读入语句进行执行
先读入语句,碰到 -- 开头的语句跳过,碰到 ; 结尾的语句执行processLine(line, true) 方法,其他则对 line 进行累加。
5. 小结
CliDriver是Hive执行sql语句的入口,其中执行sql语句的过程主要在 executeDriver 方法中。
而这个方法中使用了两个主要的方法进行语句执行:processLine
和 processFile
方法。
下一节对这两个方法进行分析。