一、Hive是什么




hive数据仓库增删改 hive数据仓库建模工具_数据库


要了解Hive是什么得先了解一下数仓(数据仓库)的概念,什么又是数据仓库呢?


数据仓库的目的是为了协助输出分析报告,支持决策,为需要业务智能的企业提供业务流程的改进和指导,从而可以节省时间和成本,提高质量。


数据仓库与数据库的不同在于,数据库主要是为了很好的解决事务问题,实现对数据的增、删除、改、查,而数据仓库则主要是用来做查询分析的数据库,通常不会做数据的插入、修改、删除。


Hive作为数据仓库工具,非常适合做数据的统计分析。它可以把数据文件组成表格并且有完整的类SQL查询功能,还可以把这种类SQL的语句自动转为MapReduce任务来运行,因而使用它可以提高开发效率。


 


Hive与传统的关系数据库的异同点


Hive与RDBMS的区别


  1. 关于查询语句

区别

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脚本

用户定义函数

  1. 关于数据存储位置

数据库的数据存储在块设备或本地文件系统中,而Hive是把所有数据存储在HDFS中,关建立在Hadoop之上。


  1. 数据格式

Hive中,没有特定的数据格式,数据格式是由用户指定,用户在定义数据格式是由用户指定的,定义时需要指定3个属性:列分隔符(空格、\t、\x001);行分隔符(\n);读取文件数据的方法,在加载数据时,不需要从用户数据格式到Hive本身定义的数据格式传换,所以,在Hive加载过程中不会对数据本身做任何调整,只是把数据内容复制到HDFS目录中


传统的数据库中,由于不同的数据库有不同的引擎,它们各自定义了自己的数据格式,数据会按一定的组织结构进行存储,因而在数据库加载过程中会比较耗时


  1. 数据更新

Hive是不支持对数据的修改和增加的,所有的数据都在加载过程中完成,而传统的数据库常常会进行修改、查询、增加等操作


  1. 索引

Hive在加载数据时不会对数据做任何的处理,也不会对数据做扫描处理,所以也没有对数据中某些键值创建索引,在Hive访问数据中满足条件的数据时,需要扫描全部数据,因而它的延迟较高,由于HQL最终会转化成MapReduce,因此可以并行访问数据,即使在没有索引的情况下,对于大批量的数据访问,它仍可以表现出优势


在传统数据库中通常会对某列或某几例建立索引,所以对于小批量的满足特定条件的数据访问,数据库具有很高的效率,以及较低的延迟。Hive相对来说延迟较高不适合做在线查询数据


  1. 执行

Hive的大多数查询是通过MapReduce来实现的,则数据库则具有自己的执行引擎


  1. 执行延迟

Hive有执行的延迟,所以只有当数据规模大到超过数据库处理能力的时候,Hive的并行计算的优势才会体现出来


  1. 可扩展性

Hive与Hadoop的可扩展性一致,而传统数据库由于ACID语义的严格限制,扩展性非常有限


  1. 处理数据规模

Hive建立在集群之上可以处理的数据规模相比于传统数据库要大很多


 


Hive的运行架构简介


Hive的用户接口主要有3个:CLI(Command Line)、Client和WUI,其中CLI是最常用的


在CLI启动时,一个Hive的副本也会随之启动


Client就是Hive的客户端,在启动这个客户端时需要指出Hive Server在哪个节点上,同时在这个节点启动Hive Server


HWI则是通过浏览器来访问Hive



hive数据仓库增删改 hive数据仓库建模工具_大数据_02


对于上图的简单解释


MetaStore:主要用来存储元数据,Hive将元数据存储在数据库中(MySql,derby……)。在Hive中元数据包含有:表名称、表的列和分区及其属性、表属性、表所在的目录……


解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化到查询计划生成,生成的查询计划存储在HDFS中,并在MapReduce中调用执行。


Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成


 


Hive的执行流程


  1. 用户提交查询任务到Driver
  2. 编译器获取用户的任务计划
  3. 编译器根据用户任务计划从MetaStore中获取需要的元数据信息
  4. 编译器对任务进行编译,先把HQL转为抽象语法树,再把抽象语句块转成查询语句块,接着把查询语句块转为逻辑的查询计划
  5. 把最终计划提交到Driver
  6. Driver把计划提交到Execution Engine,获取元数据信息,接着提交到JobTracker或SourceManager运行这个任务,任务会直接从HDFS中读取文件并进行相应的操作
  7. 获取返回执行结果

 


Hive服务介绍


  1. CLI服务

        CLI是Hive的命令行接口,也就是Shell环境。CLI启动时会同时启动一个Hive副本,这也是默认的服务


  1. HiveServer服务

        通过Thrift提供的服务(默认端口是10000),客户端可以在不启动CLI的情况下对Hive中的数据进行操作并且可以使用不同的语言编写客户端进行访问。使用Thrift、JDBC、ODBC连接器的客户端需要运行Hive服务器来和Hive进行通信


  1. HWI服务

        同过浏览器访问Hive,默认的端口是9999


  1. MetaStore服务

        使用这个服务可以让MetaStore作为一个单独的进程来运行。通过设定METASTORE_PORT环境变量可以指定服务器监听的端口号


 


元数据存储——Metastore


它是Hive存放元数据的地方,它包含两个部分:服务、后台数据存储


Hive有三种Metastore的配置方式:内嵌模式、本地模式、远程模式


内嵌模式:使用内嵌的Derby数据库来存储数据,配置简单,但是一次只能与一个客户端连接,适用于单元测试,不适用于生产环境


本地模式和远程模式:都使用外部数据库来存数据。它们两者的区别在于本地模式元数据不需要单独启动Metastore服务,因为本地元存储用的是和本地Hive在同一个进程里的Metastore服务


内嵌模式(Embedded)


连接到一个In-memory的数据库Derby,一般是用于做单元测试


本地模式(Local)


通过网络连接到一个数据库中,这个是常用的一种模式


远程模式(Remote)


用于非JAVA客户端访问元数据库,在服务器端会启动MetaStoreServer,客户端通过Thrift协议及MetaStoreServer来访问元数据库