Hive是一款开源的基于hadoop的用于统计海量结构化数据的一个数据仓库,它定义了简单的类似SQL的查询语言,称为HQL,允许熟悉SQL的用户查询数据。
从本质上讲:Hive是讲HQL语句转换成MapReduce程序的的一个工具
数据仓库是一个面向主题的,集成的,相对稳定的,反映历史变化的数据的集合,用于支持管理角色
MP是一个软件框架,基于该框架能够容易的编写应用程序,这些应用程序能够运行在大规模集群上,并以一种可靠的,具有容错能力的方式并行的处理上TB级别的海量数据集。
MR的思想就是“分而治之”,Mapper负责‘分’,即把复杂的任务分解为若干个‘简单的任务’来处理;Reduce负责对map阶段的结果进行汇总。
1.可以将结构化的数据文件映射成一张表,并提供类SQL查询功能,方便非java开发人员对hdfs上的数据做MapRedece操作;
2.可以对数据提取转化加载(ETL)
3.构建数据仓库
1.即使查询:利用CLI或者类似HUE之类的工具,可以对Hive中的数据做即时查询,如果底层的引擎使用的MR耗时会很久,可以替换成Tez或者Spark;
2.离线的数据分析:通过执行定时调度或者脚本去执行HQL语句,并将结果保存
3.构建数仓时用于组织管理数据和表
优点:
1.可扩展性,横向扩展,Hive可以自由的扩展集群的规模,一般情况下不需要重启服务,横向扩展:通过分担压力的方式扩展集群的规模;纵向扩展:升级一台服务器的硬件
2.延展性,Hive支持自定义函数,用户可以根据自己的需求来实现自己的函数
3.良好的容错性,可以保障即使有节点出现问题,SQL语句仍可完成执行
缺点:
1.Hive不支持记录级别的增删改操作,但是用户可以通过查询生成新表或者将查询结果导入到文件中
2.Hive的查询延时很严重,因为MRJ的启动过程消耗很长时间,所以不能用在交互查询系统中
3.Hive不支持事务,因为没有增删改,所以主要用来做OLAP(联机分析处理),而不是OLTP(联机事务处理),这就是出局处理的两大级别。
1.数据存储位置
hive存储在HDFS。数据库将数据保存在块设备或者本地文件系统中。
2.数据更新
hive中不建议对数据的改写,而数据库中的数据通常是需要经常进行修改的
3.执行延迟
hive执行延迟较高,数据的执行延迟较低。当然,这个是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。
4.数据规模
Hive支持很大规模的数据计算;数据库可以支持的数据规模较小。
5.索引
hive较弱,不适合实时查询,数据库有索引
6.可扩展性
hive的扩展性较高,数据库的低
7.写时模式和读时模式
传统数据库时写时模式,在load过程中,提升了查询性能,因为预先解析之后可以对列建立索引,并压缩,但这样也会花费更多的加载时间
hive是读时模式,load data非常迅速,因为它不需要读取数据进行解析,仅进行文件的复制和移动。
hive的内部架构由四部分组成:
用户接口:CLI(hive shell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问hive)
元数据:元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等。
Hadoop:使用 HDFS 进行存储,使用 MapReduce 进行计算
驱动器:主要包含以下几类:
a.解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
b.编译器(Physical Plan):将AST编译生成逻辑执行计划。
c.优化器(Query Optimizer):对逻辑执行计划进行优化。
d.执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。
**执行流程:**HQL通过命令行或者客户端提交,经过Compiler编译器,运用MetaStore中的元数据进行类型检测和语法分析,生成一个逻辑方案,然后通过的优化处理生成一个MapReduce任务。
HQL(Hive QL)语句是怎么执行的
1.解释器完成词法,语法和语义的分析以及中间代码的生成,最终转换成抽象语法树;
2.编译器将语法树编译为逻辑执行计划
3.逻辑层优化器对逻辑执行进行优化,由于Hive最终生成的MR任务中,Map阶段和Reduce阶段由OperatorTree组成,所以大部分逻辑层优化器通过变换OperatorTree,合并操作符,达到减少MR job和减少shuffler数据量的目的。
4.物理层优化器进行MR任务的变换,生成最终的物理执行计划
5.执行器调用底层的运行框架执行最终的物理执行计划
1.Hive的存储结构包括数据库、表、视图、分区和表数据等,数据库、表、分区等等都对应HDFS上的一个目录,表数据对应HDFS对应目录下的文件。
2.Hive中所有的数据都存储在HDFS中,没有专门的数据存储格式,因为Hive是读模式,可以支持TextFile、SequenceFile、RCFile或者自定义格式等。
3.只需要在创建表的时候告诉Hive数据中的行列分隔符,Hive就可以解析数据
4.Hive包含一下数据模型:
database:在 HDFS 中表现为${hive.metastore.warehouse.dir}目录下一个文件夹
table:在 HDFS 中表现所属 database 目录下一个文件夹
external table:与 table 类似,不过其数据存放位置可以指定任意 HDFS 目录路径
partition:在 HDFS 中表现为 table 目录下的子目录
bucket:在 HDFS 中表现为同一个表目录或者分区目录下根据某个字段的值进行 hash 散 列之后的多个文件
view:与传统数据库类似,只读,基于基本表创建
5.Hive的元数据存储在RDBMS中,除元数据外的其他所有数据都基于HDFS存储。默认情况下,Hive元数据保存在内嵌的Derby数据库中,只能允许一个会话连接,只适合简单的测试。实际生产环境中不适用,为了支持多用户会话,则需要一个独立的元数据库,使用MySQL作为元数据库,Hive内部对MySQL提供了很好的支持。
6.Hive中的表分为内部表、外部表、分区表和Bucket表
内部表和外部表的区别:
删除内部表,删除表元数据和数据
删除外部表,删除元数据,不删除数据
内部表和外部表的使用选择:
分区表和分桶表的区别:
Hive数据表可以根据某些字段进行分区操作,细化数据管理,可以让部分查询更快。同时表和分区也可以进一步被划分为Buckets,分桶表的原理和MapReduce编程中的HashPartitioner的原理类似
分区和分桶都是细化数据管理,但是分区表是手动添加区分,由于Hive是读模式,所以对添加进分区的数据不做模式校验,分桶表中的数据是按照某些分桶字段进行Hash散列形成的多个文件,所以数据的准确性也高很多。
hive支持关系型数据中大多数基本数据类型
类型 | 描述 |
---|---|
boolean | true/false |
tinyint | 1字节的有符号整数 |
smalint | 2个字节的有符号整数 |
int | 4个字节的带符号整数 |
bigint | 8字节带符号整数 |
float | 4字节单精度浮点数 |
double | 8字节双精度浮点数 |
deicimal | 任意精度的带符号小数 |
String | 字符串,变长 |
varchar | 边长字符串 |
char | 固定长度字符串 |
binary | 字节数据 |
timestamp | 时间戳 |
date | 日期 |
这些数据类型都是对java中接口的实现,因此这些类型的具体行为细节和java中对应的类型是完全一直的
类型 | 描述 | 示例 |
---|---|---|
array | 有序的的同类型的集合 | array(1,2) |
map | key-value,key必须为原始类型,value可以任意类型 | map(‘a’,1,’b’,2) |
struct | 字段集合,类型可以不同 | struct(‘1’,1,1.0), named_stract(‘col1’,’1’,’col2’,1,’clo3’,1.0) |
Hive会为每个创建的数据库再HDFS上创建一个目录,该数据库的表会以子目录形式存储,表中的数据会以表目录下的文件形式存储。对于default数据库,默认的缺省数据库没有自己的目录,default数据库下的表默认存放再/user//hive/worehouse目录下。
textfile为默认存储格式,存储方式为行存储,数据不做压缩,磁盘开销打,数据解析开销大
其是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。
SequenceFile支持的三种压缩格式:NONE,RECORD,BLOCK。Record压缩率低,一般建议Block
一种行列存储相结合的存储方式
数据按照行分块,每个块按照列分块,其中每个块都存储有一个索引。hive给出的新格式。属于RCFile的升级,性能有很大的提升,而且数据可以压缩存储,压缩快,快速列存取。
Parquet也是一种行式存储,同时具有很好的压缩性能;同时可以减少大量的表扫描的反序列化的时间。
行列存储对比:
对比 | 行存储 | 列存储 |
---|---|---|
写性能 | 写入时一次性完成,性能高 | 把一行数据拆分成成列保存,写入次数比行存储多。 |
读性能 | 读取整行数据时,性能高。 读取少数列时,IO开销大 | 取数列时性能高,读取行时性能低 |
数据压缩 | 压缩低 | 列为单位存储数据,使得同类型的相同数据存放在一起,压缩比较高 |
典型代表 | Text File、Squence File | ORC、Parquet、Carbon Data |
与库有关的操作
建库
create database t1;
看库
show database;
建库时查看吃否存在
create database if not exists t1;
建库时带注释
create database if not exists t2 comment `desc xxx`;
建库带属性
create database if noe exists t3 with
dbproperties('creator'='hadoop','date'='2018-04-05');
实现库详细信息
desc database [extended] t1;
查看正在使用的库
select current_database();
删除库
drop database t1;
drop database if exists t2;
默认情况下,hive不允许删除包含表的数据库,有两种解决方法:
1.手动删除库下所有表,然后删除表
2.使用 cascade 关键字
切换库
use t3;
与表有关的操作
建表语法:
create [external] table [if not exists] table_name
[( col_name data_type [comment col_comment ], ...... )]
[comment table_comment]
[Partitioned by (col_name data_type[comment col_comment], ... )]
[Clustered by (col_name,col_name,...)
[sored by (col_name[ASC|DEDC],...)] into num_buckets BUCKETS ]
[Row Format row_format]
[Stored as file_fomat]
[location hdfs_path]
建表语法介绍: