hive中sql执行流程

1.hive 执行流程的重要性

1)当我们执行sql时,sql任务非常慢,这个时候就需要分析它的执行流程

2)面试经常问:你对hive的理解,一定不要说hive就是写sql。要从表面的sql,在脑海里映射出MR流程,在哪里进行map,combiner,shuffle,reduce

2.解析sql执行计划流程

2.1 大数据sql两类执行框架:(不管多复杂的sql,最终底层都会是这两类)

1)单表查询:select a,聚合函数 from XXX group by b

2)多表join查询:select a.,b. from a join b on a.id=b.id

这两种sql框架几乎包括了所有的大数据sql,区别就在于 业务复杂程度

2.2解析sql执行计划图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Parser:SQL传递进来,通过Parser解析,得到AST

AST:抽象语法树,会进行语法校验,AST本质* * 还是字符串是一段字符串

Analvzer:AST通过ANalvzer之后,得到QB

QB:(query block)这个时候就是与元数据有关联了

Loqical Plan:逻辑执行计划,得到的是 Operator Tree

Loqical Optimizer:优化逻辑执行计划 得到的还是 Operator Tree

Phsical Plan:物理执行计划 得到的就是 Task Tree

Phsical Optimizer:优化物理执行计划 得到的是具体的 Task Tree
这一步是将普通的sql映射成了作业任务。

重点是优化逻辑执行计划和优化物理执行计划

3.sql执行计划映射MR流程

3.1过滤类查询sql

select a.id,a,city, a.cate form access a where a.day=’20190414’ and a.cate= ‘奔驰’

整个job是没有reduce的,类似etl作业。其中map数是由文件分片数决定。分区条件直接在数据读取时过滤,没有shuffle、仅仅就是过滤而已.

3.2分组聚合类查询sql

select city, count(1) form access a where a.day=’20190414’ and a.cate= ‘奔驰’ group by city

1
2
3
4
5
6
7
mr count
1) map: split ==> (word, 1)
2) shuffle: (word,1) partitioner ==> reduce
3) reduce: (word, 可迭代的(1,1,1,1...))
==> (word, sum(可迭代的))

和WC的流程没有本质区别,如上图combiner是本地局部的redece,好处是减少shuffle的数据量,但不是任何场景都会发生combiner,如求平均数。
3.3join类查询sql

等待后续并补充

4. 执行计划优化

等待后续补充

扩展1:reducebykey和groupbykey的区别,前者会发生combiner 局部聚合,而后者不会,前者获得的是相同key对应的一个元素,后者是获取元素集合。reducebykey更加适合大数据,少用groupbykey(全数据shuffle)

扩展2:map task数是由数据文件分片数决定的分片数即是map任务数,程序员只能给个期望值

扩展3:reduce task数是由输入reduce的数据的分区(partitions)数决定的即分区数为map任务数,默认是1,程序员可直接设置reduce个数来改变reduce task数,reduce task数决定来 生成的文件数。

扩展4: MR数据shuffle确定数据发往哪一个reduce分区的规则是:取key的hashcode值对分区数模。

扩展5:explain sql ;查看某sql语句的执行计划

本文标题:hive中sql执行流程

文章作者:skygzx

发布时间:2019年04月18日 - 14:03

最后更新:2019年04月18日 - 15:28

原始链接:http://yoursite.com/2019/04/18/hive中sql执行流程/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------
0%