1. 架构与组成
Hive架构Hive的核心组件:
- 用户接口模块:包括CLI、HWI、JDBC、ODBC、Thrift Server
- 驱动模块(Driver):包括编译器、优化器、执行器等,负责把HiveSQL语句转换成一系列MapReduce作业
- 元数据存储模块(Metastore)是一个独立的关系型数据库(自带derby数据库,或MySQL数据库),该数据库存储着与数据库,表,列,数据类型以及在HDFS中的位置的所有相关元数据.
2. Hive数据模型
2.1 数据模型
- Hive元数据信息存储在关系数据库中
- 实际数据存储依赖HDFS
-
Hive通过以下模型来组织HDFS上的数据
Hive数据模型
- 数据库: 命名空间将数据将表与其它数据单元分离开来,防止命名冲突.
- 表: 组织具有相同结构的记录集合.
- 分区: 分区是基于特定属性分类给定信息的数据的逻辑隔离.
- 桶 (或 集群): 与分区相似,但是用哈希函数来分离数据 和 确定记录应该到达的集群或桶
分区和分桶是可选的,只是为了提高性能并使数据更易于管理
2.2 Database
- Database是Hive数据模型的最上层,跟关系数据库中的Database意义相似
- 通过Database来逻辑划分Hive表的命名空间,避免表同名冲突
- Hive默认自带的Database名为default
- HDFS存储路径由配置决定,一个Database一个子目录
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property></pre>
2.3 Table
2.3.1 管理表和外部表
-
Hive中的表和关系型数据库中的表在概念上很类似
-
每个表在HDFS中都有相应的目录用来存储表的数据
-
根据数据是否受Hive管理,分为:
- Managed Table(管理表)
- External Table(外表)
-
区别:
-
Managed Table:
- HDFS存储数据受Hive管理,在统一的路径下:
${hive.metastore.warehouse.dir}/{database_name}.db/{tablename}
- Hive对表的删除操作影响实际数据的删除
- HDFS存储数据受Hive管理,在统一的路径下:
-
External Table:
- HDFS存储路径不受Hive管理,叧是Hive元数据不HDFS数据路径的一个映射
- Hive对表的删除操作仅仅删除元数据,实际数据不受影响
-
内部表转换为外部表
ALTER TABLE T_NAME SET TBLPROPERTIES ('EXTERNAL'='TRUE')
2.3.2 永久表和临时表
- Permanent Table是指永久存储在HDFS之上的表,默认创建表为永久表
- Temporary Table是指仅当前Session有效的表,数据临时存放在用户的临时目录下,当前session退出后即删除
- 临时表比较适合于比较复杂的SQL逻辑中拆分逻辑块,或者临时测试
注意:
- 如果创建临时表时,存在不之同名的永久表,则临时表的可见性高于永久表,即对表的操作是临时表的,用永久表无效
- 临时表不支持分区
2.4 Partition
-
基于用户指定的分区列的值对数据表进行分区
-
表的每一个分区对应表下的相应目录,所有分区的数据都是存储在对应的目录中
${hive.metastore.warehouse.dir}/{database_name}.db/{tablename}/{partitionkey}={value}
-
分区的优点
- 分区从物理上分目录划分不同列的数据
- 用于查询的剪枝,提升查询的效率
-
可以多级Partition,即指定多个Partition字段,但所有Partition的数据不可无限扩展(多级目录造成HDFS小文件过多影响性能)
2.5 Bucket
- 桶作为另一种数据组织方式,弥补Partition的短板(不是所有的列都可以作为Partition Key)
- 通过Bucket列的值进行Hash散列到相应的文件中,重新组织数据,每一个桶对应一个文件
- 桶的优点:
- 有利于查询优化,比如SMB Join
- 对于抽样非常有效
- 桶的数量一旦定义后,如果更改,只会修改Hive元数据,实际数据不会重新组织
网友评论