Hive是如何让MapReduce实现SQL操作的

前面我们说过MapReduce的运算流程,整体架构方法,JobTracker与TaskTracker之间的通信协调关系等等。虽然知道我们只需要自己完成Map和Reduce就可以实现MapReduce的运算,但是还有很多人习惯使用SQL进行数据分析,MapReduce编程不是那么容易,因此就有了Hive的存在。

首先看看如何用MapReduce实现SQL数据分析。

MapReduce实现SQL的原理

先看一个简单的SQL语句:

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

先来看看MapReduce实现SQL的原理。

具体数据输入和执行结果请看下图:
在这里插入图片描述
左边是要分析的表,右边是分析结果。实际上把左边表相同的行进行累计求和,就能得到右边的表,看起来和WordCount计算很类似,确实也是这样。

来看看这条SQL语句的MapReduce的计算过程:

  1. 首先是Map的计算,先整理成map的形式,也就是<1,25>,<2,25>此类的,然后与count值进行结合成一个新的map,也就是<<2,25>,1>这样。
  2. map的输出经过shuffle之后,相同的key value组合到一起,也就是<<2,25>,<1,1>>,<1,1>代表的是Value记录
  3. 到了reduce阶段,进行聚合,也就是<<2,25>,2>

如下图:
在这里插入图片描述
在数据仓库中SQL是最常用的分析工具,既然一条SQL可以通过MapReduce程序实现,那么Hive也可以。
现在来看看一下Hive架构。

Hive的架构

Hive能够直接处理输入的SQL语句,调用MapReduce计算框架完成数据分析操作。来看看架构图:
在这里插入图片描述
通过Hive的Client向Hive提交SQL命令。

如果是创建数据表的DDL语句。Hive就会通过执行引擎Driver将数据表的信息记录在Metastore元数据组件中,这个组件通常用一个关系数据库实现,记录表名、字段名、字段类型、关联HDFS文件路径等这些数据库的Meta信息。

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

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

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

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

Hive如何实现join操作

除了上面这些简单的聚合过滤操作,Hive还能执行连接(join on)操作。

		SELECT pageid , age,count(1) from pv_users group by pageid,age;

这是文章开头的SQL语句,pv_users表的数据在实际中是无法直接得到的,因为pageid数据来自用户访问日志,每个用户进行一次页面浏览,就会生成一条访问记录,保存在page_view表中。而age年龄信息则记录在用户表user中。pv_user表是和另一张表关联的,我们select的数据也来自不同的表,那么就需要join操作了,先看我所说的两张表:
在这里插入图片描述
假设是靠userid关联的,然后来重新表达一下新的SQL语句。

select pv.pageid,u.age 
from page_view pv 
join user u on (pv.userid = u.userid);

同样,这个SQL命令也可以转化为MapReduce计算,连接的过程如下图所示:
在这里插入图片描述
从图上看,join的MapReduce计算过程和前面的group by稍有不同,因为join涉及到两张表,来自两个文件,所以需要在map输出的时候进行标记,比如来自第一张表的输出Value就标记为<1,X>,1表示数据来自第一张表。

然后会进行shuffle,相同的key被输入到同一个reduce函数进行聚合,根据表的标记对value数据求笛卡尔积,用第一张表的每条记录和第二张表的每条记录连接,输出就是join的结果。

Hive的源码中join的时间复杂度O(n²),对来自两张表的记录进行连接操作。

总结

随着大数据SQL的应用市场多样化之后更多的大数据SQL引擎也很火。

Cloudera开发了Impala,这是一种运行在HDFS上的MPP架构的SQL引擎。和MapReduce启动Map和Reduce两种执行过程,将计算分成两个阶段进行计算不同,Impala在所有DataNode服务器上部署相同的Impalad进程,多个Impalad进程相互协作,共同完成SQL计算,在一些统计场景中,Impala可以做到毫秒级的计算速度。

后来SparkSql出现了,引擎是基于Spark的,由于速度很快,快于Hive,所以后来Hive也兼容了Spark,可以在Spark上计算Hive的执行计划。总的来说这么多集群,做到技术嫁接,还是很有创新性的。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于hadoop的Hive数据仓库JavaAPI简单调用的实例,关于Hive的简介在此不赘述。hive提供了三种用户接口:CLI,JDBC/ODBC和 WebUI CLI,即Shell命令行 JDBC/ODBC 是 Hive 的Java,与使用传统数据库JDBC的方式类似 WebGUI是通过浏览器访问 Hive 本文主要介绍的就是第二种用户接口,直接进入正题。 1、Hive 安装: 1)hive的安装请参考网上的相关文章,测试时只在hadoop一个节点上安装hive即可。 2)测试数据data文件'\t'分隔: 1 zhangsan 2 lisi 3 wangwu 3)将测试数据data上传到linux目录下,我放置在:/home/hadoop01/data 2、在使用 JDBC 开发 Hive 程序时, 必须首先开启 Hive 的远程服务接口。使用下面命令进行开启: Java代码 收藏代码 hive --service hiveserver >/dev/null 2>/dev/null & 我们可以通过CLI、Client、Web UI等Hive提供的用户接口来和Hive通信,但这三种方式最常用的是CLI;Client 是Hive的客户端,用户连接至 Hive Server。在启动 Client 模式的时候,需要指出Hive Server所在节点,并且在该节点启动 Hive Server。 WUI 是通过浏览器访问 Hive。今天我们来谈谈怎么通过HiveServer来操作Hive。   Hive提供了jdbc驱动,使得我们可以用Java代码来连接Hive并进行一些类关系型数据库的sql语句查询等操作。同关系型数据库一样,我们也需要将Hive的服务打开;在Hive 0.11.0版本之前,只有HiveServer服务可用,你得在程序操作Hive之前,必须在Hive安装的服务器上打开HiveServer服务,如下: 1 [wyp@localhost/home/q/hive-0.11.0]$ bin/hive --service hiveserver -p10002 2 Starting Hive Thrift Server 上面代表你已经成功的在端口为10002(默认的端口是10000)启动了hiveserver服务。这时候,你就可以通过Java代码来连接hiveserver,代码如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值