hive源码 观后总结
整体流程
1.进入程序,利用Antlr框架定义的预发规则,对HQL完成语法解析,将HQL转换为AST(抽象语法树)
2.遍历AST,抽象出查询的基本构成单元QueryBlock(查询块),可以理解为最小查询执行单元
3.遍历QueryBlock,将它转换为OperatorTree(操作树),可以理解成不可拆分的逻辑执行单元
4.逻辑优化器对OperatorTree进行逻辑优化。
5.OperatorTree转换为TaskTree,就是翻译成MR任务的流程,将逻辑执行计划转换为物理执行计划
6.物理优化器对TaskTree进行物理优化
7.生成最终的执行计划,提交到集群运行
重要类详解
CliDriver:
1.参数设置,日志标准化,-S -e -f -i -database 等参数
2.每一行 按照;切分 处理 shell处理 处理exit ctrl+C 计算时长、打印结果
Driver:
1.hook Driver run之前的hook、语法分析之前hook、执行计划前hook、task执行前 后 失败hook
2.sql 通过antlr转成AST(抽象语法树)
FromClauseParser.g:from后面的sql的匹配规则 SelectClauseParser.g:select后面的sql的匹配规则
IdentifiersParser.g:函数的解析 HiveParser.g:语法解析的
上面基本上就是一些关键字,下面主要是函数都是一个关键字组成的语法:一个init和after函数
init其实大部分是打印日志的 after主要枚举了可以执行的语法
AST TOK_*** 树状结构不简洁:SELECT->TOK_TABLE_OR_COL->真正名称
3.物理执行计划执行:两个队列一个running 一个runnable
两种执行方式:1.一个程序执行:hive-exec-3.1.3.jar org.apache.hadoop.hive.ql.exec.mr.ExecDriver
2.yarn 提交job
SemanticAnalyzer:
1.替换数字
2.AST转换为QB(查询块) JOIN以后的对象还是AST存储qbp,join以前的aliasToSubq aliases 里面存储
3.QB转OperatorTree(操作树 逻辑执行树) TS SEL GBY RS FIL FS 逻辑执行的优化
Rule定义:R1(TS) R2[RS] R3[FIL] .startwork 如果符合上面定义的规则,才对树进行操作
or换成in where(struct用法拆出来分区字段) 条件传播(where传播) 表达式算成常量
where下推 列裁剪(从最后的节点往前推) 分区裁剪(没有对树进行操作节点的属性拉出来)
分区移除(分区相关的节点移除) 节点删除(连续SEL节点去除,没有列裁剪的SEL去除)
LIMIT下推(RS 后面会跟一个limit属性) 元数据统计 取样(FS转换成LIST_SINK)
4.逻辑执行计划转换为物理执行计划 GBY节点和JOIN节点都会被转换成一个mapreduce
hive根目录+随机数 就是中间数据存储路径 path和类型 类型下推 物理执行计划就完成了
5.物理执行计划优化:mapjoin可能的优化 本地计算(单机计算) 执行结果为空limit 0
Vectorizer hive函数注册 CrossProductHandler(mr/tez MapJoin/Shuffle 交叉乘积)
rootTask对象有一个work对象(mapwork reducework childrenWork path路径)
源码解析相关博客
源码分析相关的博客:
https:
https:
逻辑优化器源码分析博客:
https: