一、上次回顾
- https://blog.csdn.net/SparkOnYarn/article/details/105706114
二、Hive SQL的执行流程
1、场景:数据量不大,但是使用Hive SQL执行起来比较慢;
Hive中常用的SQL语句?
- select yyy,聚合函数 from xxx group by yyy;
- select a.,b. from a join b on a.id=b.id;
一个SQL的执行流程大概会分为如下几个流程:
- SQL on Hadoop的一个引擎,一个SQL语句进来,把作业提交到集群环境中去执行,结果出来,对于使用者来说,这一步就是个黑盒子,不去了解的话根本就不会知道;
无外乎几个动作,SQL语句进来,有一个SQL parse的过程 --> AST(抽象语法树,是一个字符串)–> Analyzer(去到meta info中查看表字段在不在)–> Logical Plan(逻辑执行计划)–> 对应的是一堆Operator Tree --> 逻辑执行计划优化 --> 物理执行计划 --> 物理执行计划优化 --> 提交一堆task;
重要的两个过程:逻辑执行计划优化、物理执行计划优化
1、Predicate Push Down
2、Mapjoin
如上两步发生在哪两个过程?
2.1、Select 的过程
join不仅仅只有sql中的join,还有map join和reduce join,看见一个join知道底层是怎么样的;使用mapreduce的思想去描述出来;
-
select a.id,a.city,a.catalog from access a where a.day=‘2019-04-14’ and a.catalog=‘奔驰’; (求出这个表中分区中带大奔的视频有哪些),这个sql不涉及shuffle,仅仅只是过滤而已;access这个 表的数据是存放在hdfs上的,既然涉及到读取表,就肯定存在inputsplit(输入分片),假设这个SQL语句进来有两个分片
-
下图解析:两个输入分片对应两个map task,map中的逻辑就是先拆分,splits(2)拿到类别字段,第二个字段=大奔,就会收集出来,map就已经结束了,直接输出了。
-
inputsplit划分为几块取决于blocksize的大小
group by 的过程
- group by条件后跟的字段在select中也要有,select city, count(1) from access where day = ‘20190414’ and catalog = ‘大奔’ group by city;
mr的count是怎么执行的:
1、map: split --> (word,1)
2、shuffle:(word,1)partitioner --> reduce
3、reduce:(word,可迭代的(1,1,1,1,1,)) --> (word, sum(可迭代的1))
1)、map:split --> (city,1),可能还会涉及到Combiner过程,Combiner:local reducer局部的聚合
task tree是最终的发送map task和reduce task去运行的,一个SQL进来是在哪个层面做什么调优的呢,按照split去读取数据,经过map按照所需要的城市求次数,经过combine操作,计算每一个task的结果,经过shuffle把每一个reduce中的key分到不同的reduce上去,结果累加计算;
三、Hive中的UDF函数
- https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
- UDF:一对一,upper substr
- UDAF:多对一,sum
- UDTF:一对多,lateral view
四、本次课程涉及面试题
面试题:你对Hive的认识?
- 答:Hive就是在写SQL,这句话的理解是非常片面的;impala等等底层的执行流程大体是一致的,SQL是考察的一个功底,增量求全量,全量求增量;在大数据时代,存储、机器来说成本还是比较高的。
combiner的使用场景
Spark中reduceByKey和GroupByKey的区别