在工作中,透彻的理解hive sql执行mapreduce的过程是非常有必要的;

以下2种使用场景;

1)SQL执行过程慢,要理解整个mapreduce过程,对于排查原因是非常有帮助的;

2)面试的时候,有经验的从业人员都会问到这个问题;


官网explain参考wiki:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Explain


通过图示,来说明SQL转换为MapReduce的过程:

    hive sql语句转换成mapreduce作业流程_ sql

SQL转化为MapReduce任务的,整个编译过程分为六个阶段:

1.SQL Parse:Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树(AST)
2.Analyzer:遍历AST,抽象出查询的基本组成单元QueryBlock(QB)
3.Logical Plain:遍历QueryBlock,翻译为执行操作树Operator Tree
4.Logical Optimizer:逻辑层优化器进行Operator Tree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量;
5.Phsical Plain:遍历Operator Tree,翻译为MapReduce任务
6.Phsical Optimizer:物理层优化器对MapReduce任务的优化(如使用MapJoin优化器),生成最终的执行计划;

参考:https://www.cnblogs.com/Dhouse/p/7132476.html


对整个hive sql进行分析,无非是以下两种格式的复杂写法:

    写法一,group by场景:select yyy, 聚合函数 from xxx group by yyy;

    写法二,join场景:select a.*, b.* from a join b on a.id=b.id; 

    这两种sql框架,概括了所有的大数据sql,几乎不可能有第三种写法,区别可能是业务复杂,写的复杂点儿而已。

select实现原理:

select a.id, a.city, a.cate from access a where a.day='20190414' and a.cate='大奔'


        hive sql语句转换成mapreduce作业流程_hive_02

    没有shuffle、仅仅就是过滤而已

group by实现原理:

select city, count(1) cnt from access  where day='20190414' and cate='大奔' group by city

 hive sql语句转换成mapreduce作业流程_mapreduce_03