大数据仓库Hive原理与架构

前面讲到,MapReduce计算模型可以解决绝大多数的数据分析与数据挖掘任务,那么对于如下我们常见的一条SQL分析语句,MapReduce如何编程实现?

SELECT pageid, age, count(1) FROM pv_users GROUP BY pageid, age;

这是一条非常常见的SQL统计分析语句,统计不同年龄的用户访问不同网页的兴趣偏好,对于产品运营和设计很有价值。具体数据输入和执行结果如下图示例。

group by输入输出示例

左边是要分析的数据表,右边是分析结果。实际上把左边表相同的行累计求和,就得到右边的表了,看起来跟WordCount的计算很一样。确实也是这样,我们看下这条SQL语句的MapReduce的计算过程,map和reduce函数的输入输出以及函数处理过程分别是什么样。

首先,看下map函数的输入key和value,key不重要,忽略掉,value就是左边表中每一行的数据,<1, 25>这样。map函数的输出就是以输入的value作为key,value统一设为1,<<1, 25>, 1>这样。

map函数的输出经过shuffle以后,相同的key及其对应的value被放在一起组成一个<key,value集合>,作为输入交给reduce函数处理。如<<2, 25>, 1>被map函数输出两次,那么到了reduce这里,就变成输入<<2, 25>, <1, 1>>,key是<2, 25>, value集合是<1, 1>。在reduce函数内部,value集合里所有的数字被相加,然后输出。reduce的输出就是<<2, 25>, 2>。

计算过程如下图示例。

group by的MapReduce计算过程示例

这样一条很有实用价值的SQL就这样被很简单的MapReduce计算过程处理好了。在数据仓库中,SQL是最常用的分析工具,那么有没有能够自动将SQL生成MapReduce代码的工具呢?这个工具就是Hadoop大数据仓库Hive。

Hive能够直接处理用户输入的SQL语句(Hive的SQL语法和数据库标准SQL略有不同),调用MapReduce计算框架完成数据分析操作。具体架构如下图。

Hive架构

用户通过Hive的Client(Hive的命令行工具,JDBC等)向Hive提交SQL命令。如果是创建数据表的DDL语句,Hive就会通过执行引擎Driver将数据表的信息记录在Metastore组件中,这个组件通常用一个关系数据库实现,记录表名、字段名、字段类型、关联hdfs文件路径等这些数据库的meta信息(元信息)。

如果用户提交的是查询分析数据的DQL语句,Driver就会将该语句提交给自己的编译器Compiler进行语法分析、语法解析、语法优化等一系列操作,最后买QQ生成一个MapReduce执行计划。然后根据该执行计划生成一个MapReduce的作业,提交给Hadoop MapReduce计算框架处理。

对于一个较简单的SQL命令,比如:

SELECT * FROM status_updates WHERE status LIKE ‘michael jackson’;

其对应的Hive执行计划如下图。

Hive执行计划示例

Hive内部预置了很多函数,Hive的执行计划就是根据SQL语句生成这些函数的DAG(有向无环图),然后封装进MapReduce的map和reduce函数中。这个例子中,map函数调用了三个Hive内置函数TableScanOpoerator、FilterOperator、FileOutputOperator,就完成了map计算,而且无需reduce函数。

除了上面这些简单的聚合(group by)、过滤(where)操作,Hive还能执行连接(join on)操作。上面例子中,pv_users表的数据在实际中是无法直接得到的,因为pageid数据来自用户访问日志,每个用户进行一次页面浏览,就会生成一条访问记录,保存在page_view表中。而年龄age信息则记录在用户表user中。如下图。

page_view表和user表示例

这两张表都有一个相同的字段userid,根据这个字段可以将两张表连接起来,生成前面的pv_users表,SQL命令如下:

SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON (pv.userid = u.userid);

同样,这个SQL命令也可以转化为MapReduce计算,如下图。

join的MapReduce计算过程示例

join的MapReduce计算过程和前面的group by稍有不同,因为join涉及两张表,来自两个文件(夹),所以需要在map输出的时候进行标记,比如来自第一张表的输出value就记录为<1, X>,这里的1表示数据来自第一张表。这样经过shuffle以后,相同的key被输入到同一个reduce函数,就可以根据表的标记对value数据求笛卡尔积,输出就join的结果。

在实践中,工程师并不需要经常编写MapReduce程序,因为网站最主要的大数据处理就是SQL分析,在Facebook,据说90%以上的MapReduce任务都是Hive产生的。Hive在大数据应用中的作用非常重要。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值