目录
2.2 Phase2 SQL基本组成单元QueryBlock
2.3 Phase3 逻辑操作符Operator和逻辑操作树Operator Tree
2.5 Phase5 OperatorTree生成MapReduce Job的过程
文章主体源于美团网技术陈纯大作,值得拥有。原文在美团技术团队中已被删除。梳理了其中一些关键内容。并添加了一些自己的理解。
其中一部分图来自Recruit Technologies的slice:Internal Hive,一些看不懂的可以去参考一下原文(日文)。
1. MapReduce实现基本SQL操作的原理
详细讲解SQL编译为MapReduce之前,我们先来看看MapReduce框架实现SQL基本操作的原理
1.1 Join的实现原理
select u.name, o.orderid from order o join user u on o.uid = u.uid;
在map的输出value中为不同表的数据打上tag标记,在reduce阶段根据tag判断数据来源。MapReduce的过程如下(这里只是说明最基本的Join的实现,还有其他的实现方式)

1.2 Group By的实现原理
select rank, isonline, count(*) from city group by rank, isonline;
将GroupBy的字段组合为map的输出key值,利用MapReduce的排序,在reduce阶段保存LastKey区分不同的key。MapReduce的过程如下(当然这里只是说明Reduce端的非Hash聚合过程)

1.3 Distinct的实现原理
select dealid, count(distinct uid) num from order group by dealid;

如果有多个distinct字段呢,如下面的SQL
select dealid, count(distinct uid), count(distinct date) from order group by dealid;
实现方式有两种:
(1)如果仍然按照上面一个distinct字段的方法,即下图这种实现方式,无法跟据uid和date分别排序,也就无法通过LastKey去重,仍然需要在reduce阶段在内存中通过Hash去重

(2)第二种实现方式,可以对所有的distinct字段编号,每行数据生成n行数据,那么相同字段就会分别排序,这时只需要在reduce阶段记录LastKey即可去重。
这种实现方式很好的利用了MapReduce的排序,节省了reduce阶段去重的内存消耗,但是缺点是增加了shuffle的数据量。需要注意的是,在生成reduce value时,除第一个distinct字段所在行需要保留value值,其余distinct数据行value字段均可为空。

2. SQL转化为MapReduce的过程
了解了MapReduce实现SQL基本操作之后,我们来看看Hive是如何将SQL转化为MapReduce任务的,整个编译过程分为六个阶段:
- Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree
- 遍历AST Tree,抽象出查询的基本组成单元QueryBlock
- 遍历QueryBlock,翻译为执行操作树OperatorTree,
- 逻辑层优化器进行OperatorTree变换,合

本文深入探讨了MapReduce如何实现SQL基本操作,包括Join、Group By和Distinct的原理。接着详细阐述了Hive将SQL转化为MapReduce的六个阶段,包括词法语法解析、QueryBlock、OperatorTree构建、逻辑和物理优化。通过实例解析了OperatorTree生成MapReduce Job的过程,并介绍了MapJoin优化。
最低0.47元/天 解锁文章
542

被折叠的 条评论
为什么被折叠?



