Hive是个啥玩意
学习完 Hadoop 之后,在Hadoop阶段主要就是 MR的编写。但是写 MR 还是有点麻烦,会写很多无意义的代码,然而有意义的代码只有那么几行,就是map 和 reduce 中的一些业务,Driver中的代码贼无聊,也没有意义,此时Hive就出世了
。如需学习 Hadoop 专栏,参考:Hadoop 教程目录
Hive 将无聊的代码封装起来了,只需要我们为它提供一个 HQL语句
,放到 hive 框架中执行,它就能够帮我们把 HQL 语句解析成对应的 MR 去执行,这样子就简单多了,省去了中间很多无意义的代码,甚是好用。
所有的 HQL 都能够翻译成 MR 执行,但并不是所有的 MR 都能翻译成HQL(Hive能解决的问题,MR一定能解决,反之则不一定了)
1.Hive简介
Hive
:由 Facebook 开源,用于解决海量结构化
日志的数据统计工具。
Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表
,并提供类 SQL 查询
功能。
Hive 的本质,就是将 HQL 转化成 MapReduce 程序。(HQL = Hive SQL 或 HQL = Hive Query Language)
HQL→MapReduce解析过程,如图所示
①Hive 处理的数据存储在 HDFS
②Hive 分析数据底层的实现是 MapReduce
③执行程序运行在 Yarn 上
Hive相当于 Hadoop 的一个客户端。为用户提供了一个入口,提交HQL,自动解析成MR去运行,只需要一个HQL即可。Hadoop、Zookeeper都有一个集群的概念。Hive是没有集群的,它只是一个客户端。
2.Hive优缺点
优点:
- 操作接口采用类 SQL 语法,提供快速开发的能力(简单、容易上手)
- 避免了去写 MapReduce,减少开发人员的学习成本
- Hive 的执行延迟比较高,因此 Hive 常用于数据分析,对实时性要求不高的场合
- Hive 优势在于处理大数据,对于处理小数据没有优势,因为 Hive 的执行延迟比较高
- Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数
缺点:
- Hive 的 HQL 表达能力有限
1.迭代式计算无法表达(迭代:第一个MR结果作为第二个MR输入,管道方式,HQL实现的话,需要使用多层嵌套方式)
2.数据挖掘方面不擅长(由于 MapReduce 数据处理流程的限制,效率更高的算法却无法实现)- 避免了去写 MapReduce,减少开发人员的学习成本
1.Hive 自动生成的 MapReduce 作业,通常情况下不够智能化
2.Hive 调优比较困难,粒度较粗(因为只能从SQL层调优,更多调优,还得依赖Hadoop调优)
3.Hive架构图
1.用户接口:Client
CLI
(command-line interface命令行访问)、JDBC/ODBC
(jdbc 访问 hive)、WEBUI
(浏览器访问 hive)
2.元数据:Metastore
元数据包括:表名、表所属的数据库(默认是 default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等内容;默认存储在自带的 Derby 数据库中,推荐使用 MySQL 存储 Metastore
3.Hadoop
使用 HDFS 进行存储,使用 MapReduce 进行计算。
4.驱动器:Driver(这部分类似MySQL底层执行流程,参考:一条SQL语句的坎坷之旅(MySQL底层执行流程分析))
解析器(SQL Parser):将 SQL 字符串转换成抽象语法树 AST,这一步一般都用第三方工具库完成,比如 antlr;对 AST 进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
编译器(Physical Plan):将 AST 编译生成逻辑执行计划
优化器(Query Optimizer):对逻辑执行计划进行优化。
执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于 Hive 来说,就是 MR/Spark。
4.Hive 运行机制
Hive 通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的 Driver,结合元数据(MetaStore),将这些指令翻译成 MapReduce,提交到 Hadoop 中执行,最后,将执行返回的结果输出到用户交互接口
5.Hive VS 数据库
由于 Hive 采用了类似 SQL 的查询语言 HQL(Hive Query Language),因此很容易将 Hive 理解为数据库。其实从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。
数据库可以用在 Online 的应用中,但是Hive 是为数据仓库而设计的
,清楚这一点,有助于从应用角度理解 Hive 的特性。Hive 和 数据库还是有实质上的区别的。
1.查询语言
由于 SQL 被广泛的应用在数据仓库中,因此,专门针对 Hive 的特性设计了类 SQL 的查询语言 HQL。熟悉 SQL 开发的开发者可以很方便的使用 Hive 进行开发
2.数据更新
由于 Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive 中不建议对数据的改写,所有的数据都是在加载的时候确定好的。而数据库中的数据通常是需要经常进行修改的,因此可以使用INSERT INTO … VALUES
添加数据,使用UPDATE … SET
修改数据。
3.执行延迟
Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致 Hive 执行延迟高的因素是 MapReduce 框架。由于 MapReduce 本身具有较高的延迟,因此在利用 MapReduce 执行 Hive 查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive 的并行计算显然能体现出优势。
4.数据规模
由于 Hive 建立在集群上并可以利用 MapReduce 框架进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模相对较小。