what
定义:
是一种数据仓库架构,建立在hadoop之上
主要作用:
存储、查询、分析存放在HDFS/HBase中的大规模数据
执行原理:
Hive有自己的类SQL,即HQL,它将SQL解析为M/R Job,然后在hadoop上执行。允许开发自定义mapper和reducer来处理内建的mapper和reducer无法完成的复杂分析工作再查询(UDF)。而启动MapReduce是一个高延迟的一件事,每次提交任务和执行任务都需要消耗很多时间,这也就决定Hive只能处理一些高延迟的应用。
存储原理:
hive的数据存储在HDFS上,hive的表其实就是HDFS的目录,hive没有自己的数据存储格式,存储结构主要包括:数据库、文件、表、视图、索引。hive默认可以直接加载text文本文件等。创建表时,指定hive的数据的列分隔符与行分隔符,hive即可解析数据。所以,往Hive表里面导入数据只是简单的将数据移动到表所在的目录中(如果数据是在HDFS上;但如果数据是在本地文件系统中,那么是将数据复制到表所在的目录中)。
Hive中主要包含以下几种数据模型:Table(表),External Table(外部表),Partition(分区),Bucket(桶)。
表:
Hive中的表和关系型数据库中的表在概念上很类似,每个表在HDFS中都有相应的目录用来存储表的数据,这个目录可以通过${HIVE_HOME}/conf/hive-site.xml配置文件中的hive.metastore.warehouse.dir属性来配置,这个属性默认的值是/user/hive/warehouse(这个目录在HDFS上),我们可以根据实际的情况来修改这个配置。如果我有一个表table1,那么在HDFS中会创建/user/hive/warehouse/table1目录(这里假定hive.metastore.warehouse.dir配置为/user/hive/warehouse);table1表所有的数据都存放在这个目录中。有个例外是外部表。
外部表:
Hive中的外部表和表很类似,但是其数据不是放在自己表所属的目录中,而是存放到别处,这样的好处是如果你要删除这个外部表,该外部表所指向的数据是不会被删除的,它只会删除外部表对应的元数据;而如果你要删除内部表,该表对应的所有数据包括元数据都会被删除。
分区:
在Hive中,表的每一个分区对应表下的相应目录,所有分区的数据都是存储在对应的目录中。比如table1表有dt和city两个分区,则对应dt=20131218,city=BJ对应表的目录为/user/hive/warehouse/dt=20131218/city=BJ,所有属于这个分区的数据都存放在这个目录中。
桶:
对指定的列计算其hash,根据hash值切分数据,目的是为了并行,每一个桶对应一个文件(注意和分区的区别)。比如将table1表id列分散至16个桶中,首先对id列的值计算hash,对应hash值为0和16的数据存储的HDFS目录为:/user/hive/warehouse/table1/part-00000;而hash值为2的数据存储的HDFS 目录为:/user/hive/warehouse/ table1/part-00002。
由于Hive的元数据需要不断的更新、修改,而HDFS系统中的文件是多读少改的,这显然不能将Hive的元数据存储在HDFS中。目前Hive将元数据存储在数据库中,如Mysql、Derby中。
特点(与RDBMS相比):
由于设计的目标不一样,Hive目前还不支持事务;不能对表数据进行修改(不能更新、删除、插入;只能通过文件追加数据、重新导入数据);不能对列建立索引(但是Hive支持索引的建立,但是不能提高Hive的查询速度。如果你想提高Hive的查询速度,请学习Hive的分区、桶的应用)。
与传统数据库对比:在传统的RMDB中,表的模式是在数据加载的时候强行确定好的。如果在加载时发现数据不符合模式,则拒绝加载这些数据。而Hive在加载的过程中不对数据进行任何的验证操作,其只是简单的将数据复制或者移动到表对应的目录下面(${ HIVE_HOME}/warehouse/xxx)。从这方面来说,传统数据库在数据加载的过程中比Hive要慢。但是因为传统数据库在数据加载过程中可以进行一些处理,比如对某一列建立索引等,这样可以提升数据的查询性能。而在这方面Hive不行。数据库的事务、索引以及更新都是传统数据库的重要特性。但是Hive到目前也不支持更新(这里说的是对行级别的数据进行更新),不支持事务;虽然Hive支持建立索引,但是它还不能提升数据的查询速度。
Hive和hadoop的集群关系:
Hive相当于是hadoop的客户端工具,部署时不一定放在集群管理节点上
系统架构:
用户接口包括CLI(即shell)、JDBC/ODBC、WebUI;
元数据(如表名、列、表的属性(是否为外部表等)、表所在目录等)通常是存储在关系型数据库的metastore数据库中,如mysql、derby中;
解释器、编译器、优化器、执行器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划(plan)的生成,生成的查询计划存储在HDFS中,并随后由MapReduce调用执行;
用HDFS存储、用MapReduce计算。
why
hive是一种数据仓库(DataWarehouse),数据仓库将不同的数据库中的数据源整合到一起进行数据分析。数据仓库的输入方是各种各样的数据源,最终的输出用于企业的数据分析、数据挖掘、数据报表等方向。
不同数据源的数据集成,所以靠的是ETL。
- Extract,数据抽取,也就是把数据从数据源读出来。
- Transform,数据转换,把原始数据转换成期望的格式和维度。如果用在数据仓库的场景下,Transform也包含数据清洗,清洗掉噪音数据。
- Load,数据加载,把处理后的数据加载到目标处,比如数据仓库。
how
hive的使用:
(1)命令行方式CLI:shell
(2)脚本文件方式:实际生产中用的最多的方式
(3)JDBC方式:hiveserver
(4)web GUI接口:hwi方式
will
数据库:传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。
数据仓库:数据仓库系统的主要应用主要是OLAP(On-Line Analytical Processing),支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。
数据库和数据仓库存放的货物基本相同,但是摆放的方式不一样,一种侧重于业务,一种侧重于反映本质的维度。