01. Hive源码 — 入口

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) 方法 \color{grey}{(这个方法在CliDriver类中)}
    如果没有指定文件,则依次去目录 $HIVE_HOME/bin/ 、 $HIVE_CONF_DIR/ 、用户主目录下 找 .hiverc 文件,然后对其执行processFile(hivercDefault) 方法

    \color{blue}{Tips} : 从以上的执行过程我们可以知道可以在.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 方法中。
而这个方法中使用了两个主要的方法进行语句执行:processLineprocessFile 方法。
下一节对这两个方法进行分析。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 224,642评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,168评论 3 402
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 171,809评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,921评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,924评论 6 399
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,415评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,794评论 3 428
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,765评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,297评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,331评论 3 345
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,458评论 1 354
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,065评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,777评论 3 337
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,233评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,366评论 1 275
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,001评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,524评论 2 365