1. MapReduce实现SQL
下表pv_users
为用户访问网页的数据存储:
pageid | age |
---|---|
1 | 25 |
2 | 25 |
1 | 32 |
2 | 25 |
查询不同年龄段访问网页的数据情况。
1.1 SQL实现
SQL语句如下:
Select pageid, age, count(1) From pv_users Group By page_id, age;
查询结果为:
pageid | age | count |
---|---|---|
1 | 25 | 1 |
2 | 25 | 2 |
1 | 32 | 1 |
1.2 MapReduce实现
- 将
<pageid, age>
作为Map的Key,Map的输出为:<<pageid, age>, 1>
; - 通过Shuffle进行Sort后,进行Reduce;
- Reduce的输出就是:
<<pageid, age>, count>
;
下图为详细流程,便于理解:
既然SQL能够被MapReduce计算处理,而对于做数据分析的人来说,写MapReduce程序有学习成本和负担,不如继续写SQL来的方便,在这样的情况下,Hadoop大数据仓库的Hive工具就诞生了。
SQL之所以可以转为MapReduce,是因为两者在数学上是等价,MapReduce本质就是字段划分→查询→分组聚合,SQL也是这个。这也是Hive能实现的基础,SQL是声明式语言,比写MapReduce简单多了。
2. Hive的架构
Hive由Facebook开源,用于解决海量结构化日志的数据统计,能够直接处理我们输入的SQL语句(Hive的SQL语法和数据库标准SQL略有不同),调用MapReduce计算框架完成数据分析操作。
Hive实现的基本原理:
- Hive处理的数据存储在HDFS
- Hive分析数据底层的实现是MapReduce
- 执行程序运行在Yarn上
下面是它的架构图:
3. Hive执行过程
通过Hive的Client向Hive提交SQL命令。
- 如果是创建数据表的DDL(数据定义语言)
Hive会通过执行引擎Driver将数据表的信息记录在Metastore元数据组件中,通过这个组件通常用一个关系数据库实现,记录表名、字段名、字段类型、关联HDFS文件路径等数据库的Meta信息。
- 如果是查询分析数据的 DQL(数据查询语句)
Driver就会将该语句提交给自己的编译器Compiler进行语法分析、语法解析、语法优化等一系列操作,最后生成一个MapReduce执行计划。然后根据执行计划生成一个MapReduce的作业,提交给Hadoop的MapReduce计算框架处理。