一、Hive是什么
要了解Hive是什么得先了解一下数仓(数据仓库)的概念,什么又是数据仓库呢?
数据仓库的目的是为了协助输出分析报告,支持决策,为需要业务智能的企业提供业务流程的改进和指导,从而可以节省时间和成本,提高质量。
数据仓库与数据库的不同在于,数据库主要是为了很好的解决事务问题,实现对数据的增、删除、改、查,而数据仓库则主要是用来做查询分析的数据库,通常不会做数据的插入、修改、删除。
Hive作为数据仓库工具,非常适合做数据的统计分析。它可以把数据文件组成表格并且有完整的类SQL查询功能,还可以把这种类SQL的语句自动转为MapReduce任务来运行,因而使用它可以提高开发效率。
Hive与传统的关系数据库的异同点
Hive与RDBMS的区别
-
关于查询语句
区别
|
Hive
|
RDBMS
|
查询语句
|
HQL
|
SQL
|
数据存储位置 |
HDFS
|
LocalFS
|
数据格式判断
|
查询时判断
|
插入时判断
|
执行
|
MapReduce
|
Excecutor
|
执行延迟
|
高
|
低
|
处理数据规模
|
大
|
小
|
关于HQL与SQL的比较
特征
|
HQL |
SQL
|
更新
|
INSERT
|
INSERT、UPATE、DELETE
|
事务
|
有限支持
|
支持 |
索引
|
支持
|
支持
|
延迟
|
分钟级
|
亚秒级
|
多表插入
|
支持
|
不支持
|
create table as select
|
支持
|
SQL-92中不支持,有些数据库支持
|
SELECT
|
支持排序sort by。可限制返回行数量的limit
|
SQL-92
|
子查询
|
只能在From,where或having子句中(不支持查关子查询)
|
在任何子句中支持“相关”或“不相关”的
|
视图
|
用户定义函数
|
可更新
|
扩展
|
MapReduce脚本
|
用户定义函数
|
-
关于数据存储位置
数据库的数据存储在块设备或本地文件系统中,而Hive是把所有数据存储在HDFS中,关建立在Hadoop之上。
-
数据格式
Hive中,没有特定的数据格式,数据格式是由用户指定,用户在定义数据格式是由用户指定的,定义时需要指定3个属性:列分隔符(空格、\t、\x001);行分隔符(\n);读取文件数据的方法,在加载数据时,不需要从用户数据格式到Hive本身定义的数据格式传换,所以,在Hive加载过程中不会对数据本身做任何调整,只是把数据内容复制到HDFS目录中
传统的数据库中,由于不同的数据库有不同的引擎,它们各自定义了自己的数据格式,数据会按一定的组织结构进行存储,因而在数据库加载过程中会比较耗时
-
数据更新
Hive是不支持对数据的修改和增加的,所有的数据都在加载过程中完成,而传统的数据库常常会进行修改、查询、增加等操作
-
索引
Hive在加载数据时不会对数据做任何的处理,也不会对数据做扫描处理,所以也没有对数据中某些键值创建索引,在Hive访问数据中满足条件的数据时,需要扫描全部数据,因而它的延迟较高,由于HQL最终会转化成MapReduce,因此可以并行访问数据,即使在没有索引的情况下,对于大批量的数据访问,它仍可以表现出优势
在传统数据库中通常会对某列或某几例建立索引,所以对于小批量的满足特定条件的数据访问,数据库具有很高的效率,以及较低的延迟。Hive相对来说延迟较高不适合做在线查询数据
-
执行
Hive的大多数查询是通过MapReduce来实现的,则数据库则具有自己的执行引擎
-
执行延迟
Hive有执行的延迟,所以只有当数据规模大到超过数据库处理能力的时候,Hive的并行计算的优势才会体现出来
-
可扩展性
Hive与Hadoop的可扩展性一致,而传统数据库由于ACID语义的严格限制,扩展性非常有限
-
处理数据规模
Hive建立在集群之上可以处理的数据规模相比于传统数据库要大很多
Hive的运行架构简介
Hive的用户接口主要有3个:CLI(Command Line)、Client和WUI,其中CLI是最常用的
在CLI启动时,一个Hive的副本也会随之启动
Client就是Hive的客户端,在启动这个客户端时需要指出Hive Server在哪个节点上,同时在这个节点启动Hive Server
HWI则是通过浏览器来访问Hive
对于上图的简单解释
MetaStore:主要用来存储元数据,Hive将元数据存储在数据库中(MySql,derby……)。在Hive中元数据包含有:表名称、表的列和分区及其属性、表属性、表所在的目录……
解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化到查询计划生成,生成的查询计划存储在HDFS中,并在MapReduce中调用执行。
Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成
Hive的执行流程
-
用户提交查询任务到Driver
-
编译器获取用户的任务计划
-
编译器根据用户任务计划从MetaStore中获取需要的元数据信息
-
编译器对任务进行编译,先把HQL转为抽象语法树,再把抽象语句块转成查询语句块,接着把查询语句块转为逻辑的查询计划
-
把最终计划提交到Driver
-
Driver把计划提交到Execution Engine,获取元数据信息,接着提交到JobTracker或SourceManager运行这个任务,任务会直接从HDFS中读取文件并进行相应的操作
-
获取返回执行结果
Hive服务介绍
-
CLI服务
CLI是Hive的命令行接口,也就是Shell环境。CLI启动时会同时启动一个Hive副本,这也是默认的服务
-
HiveServer服务
通过Thrift提供的服务(默认端口是10000),客户端可以在不启动CLI的情况下对Hive中的数据进行操作并且可以使用不同的语言编写客户端进行访问。使用Thrift、JDBC、ODBC连接器的客户端需要运行Hive服务器来和Hive进行通信
-
HWI服务
同过浏览器访问Hive,默认的端口是9999
-
MetaStore服务
使用这个服务可以让MetaStore作为一个单独的进程来运行。通过设定METASTORE_PORT环境变量可以指定服务器监听的端口号
元数据存储——Metastore
它是Hive存放元数据的地方,它包含两个部分:服务、后台数据存储
Hive有三种Metastore的配置方式:内嵌模式、本地模式、远程模式
内嵌模式:使用内嵌的Derby数据库来存储数据,配置简单,但是一次只能与一个客户端连接,适用于单元测试,不适用于生产环境
本地模式和远程模式:都使用外部数据库来存数据。它们两者的区别在于本地模式元数据不需要单独启动Metastore服务,因为本地元存储用的是和本地Hive在同一个进程里的Metastore服务
内嵌模式(Embedded)
连接到一个In-memory的数据库Derby,一般是用于做单元测试
本地模式(Local)
通过网络连接到一个数据库中,这个是常用的一种模式
远程模式(Remote)
用于非JAVA客户端访问元数据库,在服务器端会启动MetaStoreServer,客户端通过Thrift协议及MetaStoreServer来访问元数据库