本文以hive metastore 3.1.1000中的库表结构进行分析
hive metastore介绍
Hive Metastore(HMS)是一项单独的服务,不是Hive的一部分,甚至不必位于同一集群上。
hive metastore 用于管理hive的元数据并提供服务。这里的元数据包括:数据库、表、表的模式、目录、分区、索引以及命名空间等。
为数据库创建的目录一般在hive数据仓库目录下。
在hadoop中的位置
Hive metastore Service (HMS) 将Hive表、分区等的元数据存储在关系数据库中,并通过metastore服务API提供给客户端(包括Hive)访问这些信息
相关的配置
metastore可以存储在JPOX支持的任何数据库中。RDBMS的位置和类型可以由两个变量javax.jdo.option.ConnectionURL和javax.jdo.option.ConnectionDriverName控制。目前支持MySQL、PostgreSQL两种
在hive中,默认情况下新建的数据库以及表都位于HDFS的hive.metastore.warehouse.dir路径下
属性 | 描述 | 默认值 |
---|---|---|
hive.metastore.warehouse.dir | 指定hive表在hdfs上的存储路径 | /user/hive/warehouse |
javax.jdo.option.ConnectionURL | 配置元数据的连接URL | |
javax.jdo.option.ConnectionUserName | 元数据库连接用户名 | |
javax.jdo.option.ConnectionPassword | 元数据库连接密码 |
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/warehouse/tablespace/managed/hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://bigdata01:3306/metastore</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>metastore</value>
</property>
如何访问元数据库中的表
首先进入mysql,然后选择使用所创建的元数据库metastore
通过show tables可以看到共用75张表
数据库表结构
database
数据库相关的表详见下图
- dbs: 数据库的相关信息,存储数据库的名称、存储位置、所属的Catalog
- DB_ID为其主键,同时也是funcs、db_privs、database_params、tbls的外键。
- 一般来说,在hive metastore初始化时会自动创建一个名叫default的库,随后通过业务发展以及数据治理等需求,可进行不同业务域库的划分。
- ctlgs: Catalog的信息,存储Catalog的名称、内部表存储的根目录LOCATION_URL
- db_privs: 表记录该DB下的权限记录信息。目前的权限管理通常集成开源的类似于sentry、range等成熟的权限框架。
- database_params: 记录DB的一些扩展信息,便于进行特殊属性的扩展,comment, owner, lastaccesstime, readtime
- funcs: 存储自定义函数UDF的基本信息,一个UDF只能对应一个库下的表,
- func_ru: 存储UDF的类型以及执行的路径
table
数据表相关的表详见下图
- tbls表: 记录了table的一些基本信息,包括表名、类型、创建时间以及SD_ID等信息。
- TBL_ID是tbls的主键,同时也是table_params、tbl_col_privs、idxs、tbl_privs、partitions、partition_keys、tab_col_stats表的外键。
- 每个表都对应唯一的DB_ID,取决于你在哪个db下创建的表。在创建内部表写入meta的同时,也会创建相应的物理路径。同时会在sds表中加入DDL时设置的input output、表的location以及SERDE信息
- tbl_privs、tbl_col_privs: 记录该hive表的表及列权限认证信息。
- partitions: 记录表的DDL分区的信息
- partition_keys: 记录表的分区列信息
- idxs: 表索引信息
- sds: 存储表的输入、输出格式、存储位置 及SERDE信息
- 每个SDS对应一个CID(一个CID表示具体的column list信息)
- 一般的无partition表是一个SDS
- partition表是一个partition一个SDS
- columns_v2: 列的基本信息
--查询表信息
select * from from tbls where TBL_NAME = 't2'
--查询数据的输入输出格式、存储位置等信息
select s.* from tbls t,sds s where t.SD_ID=s.SD_ID and t.TBL_NAME = 't2'
--查询表的属性信息
select p.* from tbls t,table_params p where t.TBL_ID=p.TBL_ID and t.TBL_NAME = 't2'
--查询表的分区列
select p.* from tbls t,partition_keys p where t.TBL_ID=p.TBL_ID and t.TBL_NAME = 't2'
Partitions
表分区信息相关的表详见下图
- partitions: 记录表分区存储的元数据信息。
- PART_ID为PARTITIONS表的主键,同时也是part_col_stats、part_privs、partition_key_vals 、 partition_params表的外键。
- partitions表在metastore中是相当重要的表,关系到partition的元数据存取
- partition_keys: 记录表的分区列信息
- part_col_privs: 记录该hive表的表及列权限认证信息。
- part_col_stats: 统计每个分区的基本统计信息,用于优化
- partition_key_vals: 每个partitions对应的具体值
select p.* from tbls t,`partitions` p where t.TBL_ID=p.TBL_ID and t.TBL_NAME = 't2'
select * from partition_key_vals where PART_ID IN (790,794)
SDS
- SDS:包含计算引擎运行时需要的input与output 、location路径以及序列化的class信息。
- SD_ID为该表的主键,同时也是PARTITIONS、BUCKETING_COLS、SKEWD_COL_NAMES、SD_PARAMS、SORT_COLS、SKEWED_VALUES、IDXS的外键
- 提供table/partition对应的文件系统路径location,以及对这个数据读取的InputFormat、是否压缩、是否是子文件夹存储、SerDe类(对应于SERDES表)
- SD_PARAMS :为每个SDS的key-value参数
- SERDES :每个SDS对应的存储的SerDer类,每个SDS记录一个SERDES表的记录
- SERDE_PARAMS:SERDE的一些参数,主要是行分隔符、列分隔符、NULL字符串等等,可以每个SerDer自己定义
- columns_v2: 列的基本信息
各表的作用
主要表的作用
表名 | 作用 |
---|---|
DBS | database信息 |
DATABASE_PARAMS | 数据库的相关参数 |
FUNCS | 用户注册的函数信息 |
FUNC_RU | 用户注册函数的资源信息 |
TBLS | 存储Hive表、试图、索引表的基本信息 |
TABLE_PARAMS | 表相关信息 |
TAB_COL_STATS | |
TBL_COL_PRIVS | |
TBL_PRIVS | |
IDXS | 索引表,存储Hive索引相关的元数据 |
INDEX_PARAMS | 索引相关的属性信息 |
BUCKETING_COLS | 存储bucket字段信息,通过SD_ID与其他表关联 |
CDS | 一个字段CD_ID,与SDS表关联 |
COLUMNS_V2 | 存储字段信息,通过CD_ID与其他表关联 |
PARTITIONS | 分区记录,SD_ID,TBL_ID关联 |
PARTITION_KEYS | 存储分区字段,TBL_ID关联 |
PARTITION_KEY_VALS | 分区的值,通过PART_ID关联。与PARTITION_KEYS共用INTEGER_IDX来标示不同的分区字段 |
PARTITION_PARAMS | 存储某分区相关信息,包括文件数,文件大小,记录条数等PART_ID关联 |
PART_COL_PRIVS | 分区字段的权限信息 |
PART_COL_STATS | 分区字段的统计信息 |
PART_PRIVS | 分区的授权信息 |
SDS | 存储对应文件的基本信息,如INPUT_FORMAT、OUTPUT_FORMAT、是否压缩等。TBLS表中的SD_ID与该表关联,可以获取Hive表的存储信息。 |
SD_PARAMS | 该表存储Hive存储的属性信息 |
SORT_COLS | 排序字段,通过SD_ID关联 |
SERDES | 存储序列化反序列化使用的类 |
SERDE_PARAMS | 序列化反序列化相关信息,通过SERDE_ID关联 |
SKEWED_COL_NAMES | |
SKEWED_COL_VALUE_LOC_MAP | |
SKEWED_STRING_LIST | |
SKEWED_STRING_LIST_VALUES | |
SKEWED_VALUES | |
GLOBAL_PRIVS | 存储全局变量 |
ROLES | 角色表,和GLOBAL_PRIVS配合 |
VERSION | 存储hive的版本信息 |
SEQUENCE_TABLE | 存储sqeuence相关信息 |
分类描述表的作用
特色功能
表的列信息发生变更后,则
- 变更前的分区的colum定义保持不变,依然可以按照原先的定义读取,
- 变更后创建的分区采用新的column定义
- 表的定义引用最新的column定义
create table t1(tid int, tname string, age int);
alter table tl add columns(english int);
insert into t1 values(1,'test',2);
select * from t1 limit 1;
create table t2(id int,name string)partitioned by(gender string)row format delimited fields terminated by ',';
insert into table t2 partition(gender='M') values(1,'zhangsan');
select * from t2 limit 2;
alter table t2 add columns(english int);
insert into table t2 partition(gender='F') values(2,'lisi');
select * from t2 limit 2;