Hive的基本概念
HIVE是什么
数据仓库:倾向于数据管理,管理的原始数据可以不是存储在自己本地
应用场景
-
OLAP:联机分析处理,适用于数据仓库,hive中不支持事务
-
OLTP:联机事务处理,适用于数据库
模式
数据仓库:hive读模式时会进行校验,写模式不进行校验
数据库:关系型数据库一般是写模式,分布式数据库的模式无法确定
hive的优缺点
优点:延展性,可自定义函数
缺点:
-
不支持事务
-
不支持行级别的update、delete操作,目前支持insert操作,但性能低
-
查询延时性高,不适合实时性查询
hive和RDBMSDE的对比
hive的架构
-
用户接口层:客户端(CLI shell访问方式),ODBC/JDBC(代码),WEB UI(网页访问,不用)
-
Thrift Server:跨语言服务层,将各个语言翻译成hive识别的操作符
-
元数据库层:元数据库存储的是用于描述hive中的库或表或字段信息的数据
-
hive的元数据是结构化数据存储的,hive的元数据存储在关系型数据库,默认存储在derby数据库中,一般情况下改为mysql
-
驱动层:
-
解释器:将Hql语句转换为抽像语法树
-
编译器:将语法树编译为逻辑执行计划
-
优化器:对逻辑执行计划进行优化
-
执行器:执行器是调用底层的运行框架执行逻辑执行计划
hive的数据组织格式
-
库:同关系型数据库,便于数据的管理,将不同模块的数据存储在不同的数据库中
-
表:
内部表:表的数据hive自己进行管理,可自己决定数据的删除或添加
内部表在进行删除时,原始数据和元数据是一并删除
外部表:表的数据hdfs管理的 hive只有权利使用,没有权利删除
删除外部表时,原始数据不能删除,元数据会删除
分区表:当数据量比较大的时候 ,在进行查询的时候,如果每一次都进行全表扫描,必然造成查询性能低
分区表就是将原来的表的原始数据进行分目录存储,相当于对原始表一个区块划分,将不同的分区 存储在不同的目录下
目的:便于查询,在查询的时候可以减少查询的范围
分区表的表现形式:将表中的不同区的数据分别存储在不同的目录下
分桶表:(类似mapreduce的分区的概念)
作用:提升抽样的性能
提升join的性能
如:数据量比较大的时候先进行数据抽样抽取样本数据测试
抽样时可拿一个桶的数据作为样本数据
目录划分:将不同的桶的数据分别存储在不同的文件中
分桶的数据划分: 分桶字段.hash%分桶个数
视图:提升hql语句的可读性
hive中的视图只存在逻辑视图,不存在物化视图
-
逻辑视图:只存储视图代表的hql语句,不会进行执行
-
物化视图:将视图对应的查询语句执行出结果
-
hive的视图相当于一条查询语句的快捷方式
-
hive中的视图,在视图查询的时候才会执行
-
hive中的视图不支持insert update等操作,只支持select
数据存储
元数据存储:元数据就是存储hive中表、库的相关描述信息存储在关系型数据库默认derby 一般改为mysql
hive中的数据库的描述信息:mysql表存储的是数据库表的描述信息每当hive中创建一个数据库的时候,这个表就添加一条数据
(注意:元数据信息可以修改的,一旦元数据修改,表结构就会修改hive的表结构相关数据(库,表,字段)从元数据库加载)
原始数据存储
存储在hdfs上,默认在http://192.168.2.101:50070/user/hive/warehouse 路径下
读取的配置文件 hive-default.xml中,若要修改存储目录,可在hive-site.xml添加配置项hive.metastore.warehouse.dir