在面试时候,被问到了Hive的HQL是怎么转换成MapReduce任务的,回去查了一下资料并看了一下源码,在这里做一下整理。
编译过程概述
能大致说出编译过程,基本已经是满足面试要求了。HiveSQL ->AST(抽象语法树) -> QB(查询块) -> OperatorTree(操作树) ->优化后的操作树 ->mapreducer任务树 -> 优化后的mapreducer任务树
- Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree;
- 遍历AST Tree,抽象出查询的基本组成单元QueryBlock;
- 遍历QueryBlock,翻译为执行操作树OperatorTree ;
- 逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量;
- 遍历OperatorTree,翻译为MapReduce任务 ;
- 物理层优化器进行MapReduce任务的变换,生成最终的执行计划
源码图解
从Beeline到MR任务执行的图解,大致说明了各个类的作用(图片可以点击放大)。
参考文章: