3.2.2 Hive在交互式计算中的应用

Hive是建立在Hadoop之上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取、转化、加载等,它是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。Hive定义了简单的类SQL查询语言,称为Hive Query Language(HQL),用来从存储在Hadoop集群上的数据中查询所需要的信息。Hive方便了熟悉SQL的用户查询数据,同时这个语言也允许熟悉MapReduce开发者开发自己的Mapper和Reducer来处理内建的Mapper和Reducer无法完成的复杂的数据分析处理工作。
基于Hive的MapReduce操作分析的实验过程可通过扫描二维码查看。
1)Hive在Hadoop生态圈中的位置
Hive是一个SQL解析引擎,将SQL转译成MapReduce程序并在Hadoop上运行。Hive对外提供类似于SQL语法的HQL语句数据接口,自动将HQL语句编译转化为MR作业后在Hadoop上执行,从而降低了分析人员使用Hadoop进行数据分析的难度。
图3⁃10体现了Hive在Hadoop生态圈的位置。
可以看出,Hive作为Hadoop的数据仓库处理工具,它所有的数据都存储在Hadoop兼容的文件系统中。

图3⁃10 Hive在Hadoop中的位置
2)Hive特点
Hive在加载数据过程中不会对数据进行任何的修改,只是将数据移动到HDFS中Hive设定的目录下。因此,Hive不支持对数据的改写和添加,所有的数据都是在加载的时候确定的。基于此,Hive具有如下设计特点:
①支持索引,加快数据查询。
②不同的存储类型,例如,纯文本文件、HBase中的文件。
③将元数据保存在关系数据库中,减少了在查询中执行语义检查时间。
④可以直接使用存储在Hadoop文件系统中的数据。
⑤内置大量用户函数UDF来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF。
⑥由自定义函数来完成内置函数无法实现的操作。
⑦类SQL的查询方式,将SQL查询转换为MapReduce作业(job)在Hadoop集群上执行,也可以将SQL转换成Spark、Tez等计算框架可执行的代码,并将计算任务最终由这些计算框架来完成。
⑧编码时和Hadoop一样,都使用UTF⁃8字符集。
3)Hive体系结构
图3⁃11为Hive的体系结构。可见,它是一种建立在Hadoop基础上的用户交互接口,其底层存储仍然是Hadoop的HDFS,计算框架还调用了Hadoop的MapReduce。通过HQL可以让用户方便访问Hadoop数据,不需要用户编写复杂的MapReduce程序。
(1)用户接口
CLI:命令行界面,CLI启动的时候,会同时启动一个Hive副本。
JDBC客户端:封装了Thrift和Java应用程序,可以通过指定的主机和端口连接到在另一个进程中运行的Hive服务器。
ODBC客户端:ODBC驱动允许支持ODBC协议的应用程序连接到Hive。
Web接口:可以通过浏览器访问Hive。

图3⁃11 Hive体系结构
(2)Thrift服务器
基于Socket通信,支持跨语言。Hive Thrift服务简化了在多编程语言中运行Hive的命令。Thrift服务绑定支持C++、Java、PHP、Python和Ruby语言。
(3)解析器
编译器完成HQL语句从词法分析、语法分析、编译、优化以及执行计划的生成。
优化器是一个演化组件,当前它的规则是:列修剪,谓词下推。
执行器会顺序执行所有的作业。如果任务链不存在依赖关系,可以采用并发执行的方式执行作业。
(4)元数据库
Hive的数据由两部分组成:数据文件和元数据。元数据用于存放Hive库的基础信息,它存储在关系数据库中,如MySQL、Derby。元数据包括数据库信息、表的名字、表的列和分区及其属性、表的属性、表的数据所在目录等。
(5)Hadoop
Hive的数据文件存储在HDFS中,大部分的查询由MapReduce完成(对于包含*的查询,比如select * from tbl不会生成MapRedcue作业)。
4)Hive运行机制
如图3⁃12,Hive的运行主要通过以下四步实现。
①用户通过用户接口连接Hive,发布Hive SQL。
②Hive解析查询并制订查询计划。
③Hive将查询转换成MapReduce作业。
④Hive在Hadoop上执行MapReduce作业。

图3⁃12 Hive运行机制
5)Hive的优势
①解决了传统关系数据库在大数据处理上的瓶颈,适合大数据的批量处理。
②充分利用集群的CPU计算资源、存储资源,实现并行计算。(https://www.daowen.com)
③Hive支持标准SQL语法,免去了编写MR程序的过程,减少了开发成本。
④具有良好的扩展性,拓展功能方便。
⑤可自定义函数,实现对复杂逻辑的处理。
⑥具备较好的容错性,若出现单个数据节点的故障,任务可以正常进行。
6)Hive的缺点
①Hive的HQL表达能力有限:有些复杂运算用HQL不易表达。
②Hive效率低:Hive自动生成MR作业,通常不够智能;HQL调优困难,粒度较粗;可控性差。
③Hive无法满足交互式查询分析的性能要求。
④不支持事务型任务。
⑤对数据挖掘能力的支持有限。
针对Hive运行效率低下的问题,促使人们去寻找一种更快、更具交互性的分析框架。 Spark SQL的出现则有效地提高了SQL在Hadoop上的分析运行效率。
7)Hive的适用场景
①海量数据的存储处理。
②数据挖掘。
③海量数据的离线分析。
8)Hive的不适用场景
①复杂的机器学习算法。
②复杂的科学计算。
③联机交互式实时查询。
9)Hive安装与配置
Hive是Hadoop生态圈中的一个数据仓库工具,不是数据库。它提供SQL查询功能,但是将SQL语句转化为MapReduce任务进行的,Hive中的数据是存放在HDFS上的,可以把Hive理解为是一个Hadoop的客户端,用来提交MapReduce代码的,所以使用Hive的前提是已经安装了Hadoop。它的安装方式只有一种,可以安装在任何地方,既可以安装在集群中的任何一台计算机上,也可以安装在非集群中的计算机上。
第一步 下载Hive并解压。
Hive的下载地址:http://archive.apache.org/dist/hive/,用wget命令下载Hive并解压。
第二步 配置Hive。
需要配置Hive,这样才能够运行Hive。进入conf文件夹,并将hive⁃default.xml.template文件的内容复制到hive⁃site.xml文件中,操作如下:
Hive将元数据存储在关系数据库中,比如MySQL、Derby中。Hive默认是用Derby数据库,可以修改为MySQL(要确保计算机上面已经安装好了MySQL数据库)。
第三步 编辑/etc/profile文件。
编辑/etc/profile文件,将Hive的home目录添加进去,操作如下:
[hadoop@master conf]$ sudo vim /etc/profile
添加以下语句:
运行下面的命令,让上面的修改生效。
[hadoop@master conf]$ source /etc/profile
现在可以试一下,Hive是否安装好(需要启动Hadoop,否则不能运行成功)。
[hadoop@master conf]$ hive
如果安装成功,会出现Hive命令状态。
hive>
10)Hive常用命令
Hive的常用命令及命令功能见表3⁃7。
表3⁃7 Hive常用命令表

Hive的出现大大提高了大数据仓库相关应用的开发效率,降低了非专业开发人士使用大数据仓库的门槛。Hive提供一个更高层的抽象,通过隐藏底层Hadoop平台这些琐碎的细节,将程序员从重复工作中解脱出来,使程序员可以集中精力于业务上。然而,Hive是不能作为一个完整的数据库使用的,它响应用户查询请求的延迟较大,不支持记录级别的数据修改、增加和删除,也不支持事务。如果在使用大数据仓库时需要这些数据库的特性,那么,相比于Hive,HBase就是一个更好的选择。
11)用Hive实现单词计数
第一步 本地构造数据,数据内容如下。
第二步 在Hive上创建一张表wordcount,再将本地数据导入。
第三步 利用MapReduce思想,先把每行数据转化为一个数组的形式。
第四步 将数组的每一个单词拆分出来,每行就只有一个单词。
第五步 组合语句写一个单词统计,并排序。
第六步 得到单词计数结果如下。