2 详情分析
(1)HQL的执行形式
-
1)$HIVE_HOME/bin/hive 进入客户端,然后执行 HQL;
-
2)$HIVE_HOME/bin/hive -e “hql”;
-
3)$HIVE_HOME/bin/hive -f hive.sql;
-
4)先开启 hivesever2 服务端,然后通过 JDBC 方式连接远程提交 HQL。
可 以 知 道 我 们 执 行 HQL 主 要 依 赖 于 $HIVE_HOME/bin/hive 和 $HIVE_HOME/bin/
hivesever2 两种脚本来实现提交 HQL,而在这两个脚本中,最终启动的 JAVA 程序的主类为
“org.apache.hadoop.hive.cli.CliDriver”
,所以其实 Hive 程序的入口就是“CliDriver”这个类。
(2)服务端接收到客户端的服务请求会启动一个
CliDriver类
。该类主要完成以下功能
1)解析客户端的-e,-f等参数
2)定义标准的输入输出流
3)按照;切分HQL语句。可以执行以分号隔开的多个SQL语句,按顺序执行
(3)创建Driver类
1)Hiv
e语法解析器
会将HQL语句按照词法、语法解析,翻译成抽象的语法树【AST】
2)将抽象的语法树转换成任务树【TaskTree】,调用
分析器
的方法
-
将抽象语法树转换为查询块【 QueryBlock】,可以理解为最小的查询单元
-
遍历查询块,将其转换为操作树【OperatorTree,逻辑执行单元】,可以理解为不可拆分的逻辑执行单元
-
使用逻辑优化器对操作树进行逻辑优化
-
遍历操作树,转换为任务数【TaskTree】。也就是翻译为MR任务流程,将逻辑执行计划转换为物理执行计划
-
使用物理执优化器对任务树进行物理优化
3)提交任务执行
生成最终的执行计划提交到Hadoop集群
-
1)获取MR临时工作目录
-
2)定义分区器【Partitioner】
-
3) 定义Mapper和Reducer
-
4)实例化job
-
5) 提交job
3 流程图
Hive SQL 编译成 MapReduce 过程
编译 SQL 的任务是在上节中介绍的 COMPILER(编译器组件)中完成的。Hive将SQL转化为MapReduce任务,整个编译过程分为六个阶段:
Hive SQL编译过程
-
词法、语法解析
: Antlr 定义 SQL 的语法规则,完成 SQL 词法,语法解析,将 SQL 转化为抽象语法树 AST Tree;
Antlr是一种语言识别的工具,可以用来构造领域语言。使用Antlr构造特定的语言只需要编写一个语法文件,定义词法和语法替换规则即可,Antlr完成了词法分析、语法分析、语义分析、中间代码生成的过程。
-
语义解析
: 遍历 AST Tree,抽象出查询的基本组成单元 QueryBlock;
-
生成逻辑执行计划
: 遍历 QueryBlock,翻译为执行操作树 OperatorTree;
-
优化逻辑执行计划
: 逻辑层优化器进行 OperatorTree 变换,合并 Operator,达到减少 MapReduce Job,减少数据传输及 shuffle 数据量;
-
生成物理执行计划
: 遍历 OperatorTree,翻译为 MapReduce 任务;
-
优化物理执行计划
: 物理层优化器进行 MapReduce 任务的变换,生成最终的执行计划。
下面对这六个阶段详细解析:
为便于理解,我们拿一个简单的查询语句进行展示,对5月23号的地区维表进行查询:
select * from dim.dim_region where dt = '2021-05-23';
阶段一:词法、语法解析
根据Antlr定义的sql语法规则,将相关sql进行词法、语法解析,转化为抽象语法树AST Tree:
ABSTRACT SYNTAX TREE:
TOK_QUERY
TOK_FROM
TOK_TABREF
TOK_TABNAME
dim_region
TOK_INSERT
TOK_DESTINATION
TOK_DIR
TOK_TMP_FILE
TOK_SELECT
TOK_SELEXPR
TOK_ALLCOLREF
TOK_WHERE
TOK_TABLE_OR_COL
'2021-05-23'
阶段二:语义解析
遍历AST Tree,抽象出查询的基本组成单元QueryBlock:
AST Tree生成后由于其复杂度依旧较高,不便于翻译为mapreduce程序,需要进行进一步抽象和结构化,形成QueryBlock。
QueryBlock是一条SQL最基本的组成单元,包括三个部分:输入源,计算过程,输出。简单来讲一个QueryBlock就是一个子查询。
QueryBlock的生成过程为一个递归过程,先序遍历 AST Tree ,遇到不同的 Token 节点(理解为特殊标记),保存到相应的属性中。
阶段三:生成逻辑执行计划
遍历QueryBlock,翻译为执行操作树OperatorTree:
Hive最终生成的MapReduce任务,Map阶段和Reduce阶段均由OperatorTree组成。
基本的操作符包括:
-
TableScanOperator
-
SelectOperator
-
FilterOperator
-
JoinOperator
-
GroupByOperator
-
ReduceSinkOperator`
Operator在Map Reduce阶段之间的数据传递都是一个流式的过程。每一个Operator对一行数据完成操作后之后将数据传递给childOperator计算。
由于Join/GroupBy/OrderBy均需要在Reduce阶段完成,所以在生成相应操作的Operator之前都会先生成一个ReduceSinkOperator,将字段组合并序列化为Reduce Key/value, Partition Key。
阶段四:优化逻辑执行计划
Hive中的逻辑查询优化可以大致分为以下几类:
阶段五:生成物理执行计划
生成物理执行计划即是将逻辑执行计划生成的OperatorTree转化为MapReduce Job的过程,主要分为下面几个阶段:
-
对输出表生成MoveTask
-
从OperatorTree的其中一个根节点向下深度优先遍历
-
ReduceSinkOperator标示Map/Reduce的界限,多个Job间的界限
-
遍历其他根节点,遇过碰到JoinOperator合并MapReduceTask
-
生成StatTask更新元数据
-
剪断Map与Reduce间的Operator的关系
阶段六:优化物理执行计划
Hive中的物理优化可以大致分为以下几类:
-
分区修剪(Partition Pruning)
-
基于分区和桶的扫描修剪(Scan pruning)
-
如果查询基于抽样,则扫描修剪
-
在某些情况下,在 map 端应用 Group By
-
在 mapper 上执行 Join
-
优化 Union,使Union只在 map 端执行
-
在多路 Join 中,根据用户提示决定最后流哪个表
-
删除不必要的 ReduceSinkOperators
-
对于带有Limit子句的查询,减少需要为该表扫描的文件数
-
对于带有Limit子句的查询,通过限制 ReduceSinkOperator 生成的内容来限制来自 mapper 的输出
-
减少用户提交的SQL查询所需的Tez作业数量
-
如果是简单的提取查询,避免使用MapReduce作业
-
对于带有聚合的简单获取查询,执行不带 MapReduce 任务的聚合
-
重写 Group By 查询使用索引表代替原来的表
-
当表扫描之上的谓词是相等谓词且谓词中的列具有索引时,使用索引扫描
经过以上六个阶段,SQL 就被解析映射成了集群上的 MapReduce 任务。
欢迎关注石榴姐公众号"我的SQL呀",关注我不迷路
1 具体核心流程图介绍2 详情分析(1)HQL的执行形式1)$HIVE_HOME/bin/hive 进入客户端,然后执行 HQL; 2)$HIVE_HOME/bin/hive -e “hql”; 3)$HIVE_HOME/bin/hive -f hive.sql; 4)先开启 hivesever2 服务端,然后通过 JDBC 方式连接远程提交 HQL。可 以 知 道 我 们 执 行 HQL 主 要 依 赖 于 $HIVE_HOME/bin/hive 和 $HIVE_HOME...
MR工作流程
文章目录MR工作流程JOB提交创建staging路径获取jobId上传jar包到集群计算切片,生成切片规划文件向Stag路径写job.XML提交YARN配置上下文状态转换MRAppMasterYARNChaildMAPTaskMapOutputBuffer 环形缓冲区ReducTaskcopyPhaseFetcher线程sortPhasereducePhase写文件
JOB提交
客户端提交Job.waitForCompletion
Job.submit
setUseNewAPI()适配API
对于SQL来说,join操作可以说是最常用的操作了,那么是如何转换为MR程序的呢?
SQL语句如下????
select u.name, o.orderid from order o join user u on o.uid = u.uid;
在map的输出value中为不同表的数据打上tag标记,在
1.进入程序,利用Antlr框架定义HQL的语法规则,对HQL完成词法语法解析,将HQL转换为为AST(抽象语法树);
2.遍历AST,抽象出查询的基本组成单元QueryBlock(查询块),可以理解为最小的查询执行单元;
3.遍历QueryBlock,将其转换为OperatorTree(操作树,也就是逻辑执行计划),可以理解为不可拆分的一个逻辑执行单元;
4.使用逻辑优化器对OperatorTree(操作树)进行逻辑优化。例如合并不必要的ReduceSinkOperator,减少Shuffle数
在一篇博客 Hibernate框架之Query、Criteria、SQLQuery三个数据查询对象,介绍了Hibernate中的Query查询对象。Query对象使用的是一种面向对象类似SQL的HQL查询,HQL语法与SQL语法基本一致,本篇博客将进行HQL查询演示,并且会贴出对应的SQL语句。
一、创建基于Hibernate框架的Java项目
为了方便演示,数据库中将插入Customer、Ord...
查看explain执行计划:
使用explain关键字加上hql语句生成执行计划
一个hql语句将会有一个或者多个stage,每一个stage相当于一个mr的job,stage可以是fetch,map join、limit等操作。每一个stage都会
按照依赖关系依次执行,没有依赖关系的可以...
由于缺少具体的SQL查询语句,无法提供对应的HQL语句。但是,HQL语句与SQL语句具有相似的语法结构,可以参考以下示例将SQL查询转换为HQL查询:
假设有一个名为"Person"的实体类,其中包含"id"、"name"和"age"三个属性,可以使用以下SQL查询获取年龄大于18岁的人员信息:
SELECT * FROM Person WHERE age > 18;
可以将其转换为HQL查询:
FROM Person WHERE age > 18
需要注意的是,在HQL中使用的是实体类名而非表名,同时HQL查询语句以"FROM"关键字开头。
hive msck repair table 报错return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask
Zzq18890325621:
HBase编程实战(JAVAAPI操作编写HBase工具类)
南边的剌嘛:
HQL面试题55:阿里最新面试题之地铁站用户行为轨迹分析
later_02:
寻找链表中倒数第K个节点
Cuckoo555: