Hive 元数据解析
2017-07-14 16:03
225 查看
Hive 元数据解析
本文是笔者初步整理的Hive元数据表,有不准确的地方请轻拍,后续我会补充.
1. Hive 0.11 元数据表汇总
1.1 概览
线上Hive 0.11 metastore包括39个表,可以分为以下几类 :类别 | 表名 | 主键 | 描述 |
---|---|---|---|
Database相关 | DBS | DB_ID | 所有Hive数据库信息,包括HDFS数据目录、库名、备注等 |
DBS_PARAMS | DB_ID,PARAM_KEY | Database的属性信息 | |
TABLE相关 | TBLS | TBL_ID | 所有Hive基本表信息,包括所属DB_ID,创建者,表名,创建方式等 |
TABLE_PARAMS | TBL_ID | 表级属性,文件大小,最后一次ddl时间等等 | |
NUCLEUS_TABLES | CLASS_NAME | Hive元数据表和Hive中class类的对应关系(为什么该表是空呢?//todo) | |
SDS数据存储相关 | SDS | SD_ID | 所有Hive表、表分区所对应的HDFS数据目录和数据格式,包含序列化SERDE_ID |
SD_PARAMS | SD_ID | SDS的附加信息 | |
COLUMN相关 | CDS | CD_ID | 只有一个字段CD_ID,记录Hive数据仓库中所有的CD_ID,和COLUMN_V2关联 |
  4000 ; | COLUMN_V2 | CD_ID,COLUMN_NAME | 各hive表字段信息,包括列名,类型 |
SORT_COLS | SD_ID,INTEGER_IDX | Hive表创建时SORTED BY字段信息(字段名,sort类型,字段序号) | |
PARTITION相关 | PARTITION_KEYS | TBL_ID,PKEY_NAME | hive分区表所采用的分区键(字段),包含TBL_ID、分区字段名、分区字段序号(INTEGER_IDX) |
PARTITIONS | PART_ID | hive表分区信息,包含所属TBL_ID,分区名,如 log_date=2013-04-21 | |
PARTITION_KEY_VALS | PART_ID,INTEGER_IDX | 存储PART_ID分区,INTEGER_IDX分区字段的值(PART_KEY_VAL) | |
PARTITION_EVENTS | PART_NAME_ID | 存储PARTITION上发生的操作? | |
PARTITION_PARAMS | PART_ID | PARTITION的属性信息,如最后一次DDL时间(transisent_lastDdlTime) | |
PARTITION_COL_STATS | CD_ID | PARTITION 上列级别的统计信息 | |
SERDE序列化相关 | SERDES | SERDE_ID | hive序列化/反序列化使用到的类库信息,SLIB表示序列化采用的JAVA类 |
SERDE_PARAMS | SERDE_ID,PARAM_KEY | hive序列化/反序列化 采用的行分隔符等 | |
BUCKET桶相关 | BUCKETING_COLS | SD_ID | 采用分桶技术的SDS |
SKEW数据倾斜 | SKEWED_COL_NAMES | SD_ID,INTEGER_IDX | 空表 |
SKEWED_COL_VALUE_LOC_MAP | SD_ID,STRING_LIST_ID_KID | 空表 | |
SKEWED_STRING_LIST | STRING_LIST_ID | 空表 (只有STRING_LIST_ID一个字段) | |
SKEWED_STRING_LIST_VALUES | STRING_LIST_ID,INTEGER_IDX | 空表 | |
SKEWED_VALUES | SD_ID_OID,INTEGER_IDX | 空表 | |
PRIVS权限相关 | GLOBAL_PRIVS | USER_GRANT_ID | 空表 (全局权限管理) |
DB_PRIVS | DB_GRANT_ID | 空表 (数据库级别的权限管理,数据库权限授予信息) | |
TBL_PRIVS | TBL_GRANT_ID | 空表 (表级别的权限管理,表权限授予信息) | |
TBL_COL_PRIVS | TBL_COLUMN_GRANT_ID | 空表 (表级别的权限管理,列权限授予信息) | |
PART_PRIVS | PART_GRANT_ID | 空表 (PARTITION级别的权限管理,分区权限授予信息) | |
PART_COL_PRIVS | PART_COLUMN_GRANT_ID | 空表 (PARTITION上列级别的权限管理,) | |
ROLES | ROLE_ID | 空表 (角色表,记录所有的角色ROLE_ID、角色名、创建者、所有者) | |
ROLES_MAP | 空表 (角色管理表,记录所有的角色的授予信息) | ||
其他 | VERSIONS | VER_ID | 存储当前Schema的版本(SCHEMA_VERSION),以0.11为例,SCHEMA_VERSION=0.13 |
SEQUENCE_TABLE | SEQUENCE_NAME | 存储SEQUENCE对象下一个可用的值(NEXT_VAL) | |
TYPES | TYPES_ID | 空表,含义未知 | |
TYPE_FILEDS | TYPE_ID FIELD_NMAE | 空表,含义未知 | |
IDXS | IDX_ID | 空表,含义未知 | |
INDEX_PARAMS | IDX_ID,PARAM_KEY | 空表,IDXS的属性信息 | |
TAB_COL_STATS | CD_ID | 空表,COLUMN的统计信息,怀疑该表已被弃用 |
1.2 关系图
借用同事画的两张图1.逻辑模型:
2.物理模型:
2.各个表的含义
2.1 Database表:DBS
描述 该表存储Hive Database的元数据信息,DB_ID是数据库ID,NAME是库名,DB_LOCATION_URI是数据库在HDFS中的位置,DESC为数据库的描述信息。mysql> desc DBS; +-----------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------+---------------+------+-----+---------+-------+ | DB_ID | bigint(20) | NO | PRI | NULL | | | DESC | varchar(4000) | YES | | NULL | | | DB_LOCATION_URI | varchar(4000) | NO | | NULL | | | NAME | varchar(128) | YES | UNI | NULL | | +-----------------+---------------+------+-----+---------+-------+
例子:acorn_3g数据库的信息如下,表示该库ID为81,路径为hdfs://YZSJHL19-42.opi.com/warehouse.test/acorn_3g.db
mysql> select * from DBS where NAME='acorn_3g'; +-------+------+-------------------------------------------------------+----------+ | DB_ID | DESC | DB_LOCATION_URI | NAME | +-------+------+-------------------------------------------------------+----------+ | 81 | NULL | hdfs://YZSJHL19-42.opi.com/warehouse.test/acorn_3g.db | acorn_3g | +-------+------+-------------------------------------------------------+----------+
2. 2 Table 表
描述:TBLS 存储Hive Table的元数据信息,每个表有唯一的TBL_ID
SD_ID外键指向所属的Database,SD_IID关联SDS表的主键。 其中SDS存储列(CD_ID)等信息。TBLS.SD_ID关联SDS.SD_ID, SDS.SD_ID关联CDS.CD_ID,
CDS.CD_ID关联COLUMNS_V2.CD_ID
例子:*acorn_3g.user_act表的信息: TBL_ID为41231,TBL_TYPE为MANAGED_TABLE普通表(若值为EXTERNAL,表示外部表),DB_ID为81,表示隶属DB_ID=81的Database。
mysql> select * from TBLS where TBL_NAME='user_act' and DB_ID=81 \G *************************** 1. row *************************** TBL_ID: 41231 CREATE_TIME: 1366188055 DB_ID: 81 LAST_ACCESS_TIME: 0 OWNER: xianbing.liu RETENTION: 0 SD_ID: 263311 TBL_NAME: user_act TBL_TYPE: MANAGED_TABLE VIEW_EXPANDED_TEXT: NULL VIEW_ORIGINAL_TEXT: NULL
2.3 SDS表(数据存储表)
描述: SDS表保存了Hive数据仓库所有的HDFS数据文件信息,每个SD_ID唯一标记一个数据存储记录
CD_ID关联COLUMN_V2.CD_ID,指定该数据的字段信息
SERDE_ID关联SERDES.SERDE_ID,指定该数据的序列化信息(如是否是序列化表,DELIMITED字段等)
例子:
根据SDS表找到acorn_3g.user_act表的CD_ID是263311, SERDE_ID是263301,默认存储位置为hdfs://YZSJHL19-42.opi.com/warehouse.test/acorn_3g.db/user_act
mysql> select * from SDS where SD_ID=263311 \G *************************** 1. row *************************** SD_ID: 263311 CD_ID: 263311 INPUT_FORMAT: org.apache.hadoop.mapred.TextInputFormat IS_COMPRESSED: LOCATION: hdfs://YZSJHL19-42.opi.com/warehouse.test/acorn_3g.db/user_act NUM_BUCKETS: -1 OUTPUT_FORMAT: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat SERDE_ID: 263301 IS_STOREDASSUBDIRECTORIES:
2.4 CDS 和 COLUMN_V2 (列信息)
CDS表
描述:该表只有一个字段CD_ID,永远存储整个Hive数据仓库中的CD_ID.
例子:
可以看到acorn_3g.user_act表对应的CD_ID记录在CDS中
mysql> desc CDS; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | CD_ID | bigint(20) | NO | PRI | NULL | | +-------+------------+------+-----+---------+-------+ 1 row in set (0.00 sec) mysql> select * FROM CDS where CD_ID=263311; +--------+ | CD_ID | +--------+ | 263311 | +--------+ 1 row in set (0.00 sec)
COLUMN_V2表
描述:该表存储了一个CD_ID对应的所有字段信息
例子:
查看acorn_3g.user_act表的COLUMN信息;我们可以看到acorn_3g.user_act表有14个字段,COLUMN_NAME为字段名,TYPE_NAME为字段类型,INTEGER_IDX为字段序号
mysql> select * from COLUMNS_V2 where CD_ID=263311 order by integer_idx; +--------+---------+---------------+-----------+-------------+ | CD_ID | COMMENT | COLUMN_NAME | TYPE_NAME | INTEGER_IDX | +--------+---------+---------------+-----------+-------------+ | 263311 | NULL | id | bigint | 0 | | 263311 | NULL | action_id | int | 1 | | 263311 | NULL | user_id | bigint | 2 | | 263311 | NULL | request | string | 3 | | 263311 | NULL | visit_time | string | 4 | | 263311 | NULL | source_id | int | 5 | | 263311 | NULL | sess_id | string | 6 | | 263311 | NULL | mobile_number | string | 7 | | 263311 | NULL | from_id | string | 8 | | 263311 | NULL | app_id | string | 9 | | 263311 | NULL | version | string | 10 | | 263311 | NULL | reg_type | int | 11 | | 263311 | NULL | uniqid | string | 12 | | 263311 | NULL | failure | int | 13 | +--------+---------+---------------+-----------+-------------+
2.5 SERDES和SERDE_PARAMS (序列化)
描述:SERDES存储了所有的序列化信息(SERDE_ID,SLIB),SLIB表示序列化所采用的Java类
SERDES_PARAMS 存储序列化具体的参数及值
例子:
acorn_3g.user_act表对应的SERDE_ID=263301表示 采用hive默认序列化类org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe , DELIMITED字符为’\t’ (即创建表时指定的 …DELIMITED BY ‘\t’ …)
mysql> select * FROM SERDES where SERDE_ID=263301; +----------+------+----------------------------------------------------+ | SERDE_ID | NAME | SLIB | +----------+------+----------------------------------------------------+ | 263301 | NULL | org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe | +----------+------+----------------------------------------------------+
mysql> select SERDE_ID,PARAM_KEY,REPLACE(PARAM_VALUE,'\t','\\t') from SERDE_PARAMS where SERDE_ID=263301; +----------+----------------------+---------------------------------+ | SERDE_ID | PARAM_KEY | REPLACE(PARAM_VALUE,'\t','\\t') | +----------+----------------------+---------------------------------+ | 263301 | field.delim | \t | | 263301 | serialization.format | \t | +----------+----------------------+---------------------------------+
2.6 PARTITIONS PARTITION_KEY 和 PARTITION_KEY_VALS (分区)
PARTITION_KEYS
描述:PARTITION_KEYS 保存了所有分区表用于分区的字段
例子:
通过PARTITION_KEYS查看acorn_3g.user_act的分区信息,可看到该表是一个分区表,分区字段为log_date,其中INTEGER_IDX为分区字段的序号,和分区字段一一对应
mysql> desc PARTITION_KEYS; +--------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+---------------+------+-----+---------+-------+ | TBL_ID | bigint(20) | NO | PRI | NULL | | | PKEY_COMMENT | varchar(4000) | YES | | NULL | | | PKEY_NAME | varchar(128) | NO | PRI | NULL | | | PKEY_TYPE | varchar(767) | NO | | NULL | | | INTEGER_IDX | int(11) | NO | | NULL | | +--------------+---------------+------+-----+---------+-------+
mysql> select * FROM PARTITION_KEYS WHERE TBL_ID=41231; +--------+--------------+-----------+-----------+-------------+ | TBL_ID | PKEY_COMMENT | PKEY_NAME | PKEY_TYPE | INTEGER_IDX | +--------+--------------+-----------+-----------+-------------+ | 41231 | NULL | log_date | string | 0 | +--------+--------------+-----------+-----------+-------------+
PARTITIONS
描述:PARTITIONS存储了Hive数据仓库总所有的分区信息,每个分区由PART_ID标识,其中TBL_ID为隶属的Table,SD_ID为隶属的SDS(见2.3)
例子:
通过PARTITIONS表查看acorn_3g.user_act表的分区信息,如PART_ID为168301,名字为log_date=2013-03-01,SD_ID为231621
mysql> desc PARTITIONS; +------------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------------+--------------+------+-----+---------+-------+ | PART_ID | bigint(20) | NO | PRI | NULL | | | CREATE_TIME | int(11) | NO | | NULL | | | LAST_ACCESS_TIME | int(11) | NO | | NULL | | | PART_NAME | varchar(767) | YES | MUL | NULL | | | SD_ID | bigint(20) | YES | MUL | NULL | | | TBL_ID | bigint(20) | YES | MUL | NULL | | +------------------+--------------+------+-----+---------+-------+
mysql> select * FROM PARTITIONS WHERE TBL_ID=41231 order by PART_NAME limit 5; +---------+-------------+------------------+---------------------+--------+--------+ | PART_ID | CREATE_TIME | LAST_ACCESS_TIME | PART_NAME | SD_ID | TBL_ID | +---------+-------------+------------------+---------------------+--------+--------+ | 168301 | 1366259946 | 0 | log_date=2013-03-01 | 231621 | 41231 | | 168321 | 1366260063 | 0 | log_date=2013-03-02 | 231641 | 41231 | | 168331 | 1366260176 | 0 | log_date=2013-03-03 | 231651 | 41231 | | 168346 | 1366260298 | 0 | log_date=2013-03-04 | 231666 | 41231 | | 168361 | 1366260398 | 0 | log_date=2013-03-05 | 231681 | 41231 | +---------+-------------+------------------+---------------------+--------+--------+
PARTITION_KEY_VALS
描述:PARTITION_KEY_VALS 存储了PARTITION_KEY中描述的分区字段的值,通常配合PARTITIONS 和PARTITION_KEYS表使用。
例子:
查看分区PART_ID=168301各分区字段的值,其中PARTITION_KEY_VALS存储了所有分区字段序号(INTEGER_IDX)和值(PART_KEY_VAL)间的对应关系。本例中acorn_3g.user_act PART_ID=168301分区log_date字段的值为‘2013-03-01’
mysql> select pk.PKEY_NAME,pk.PKEY_TYPE,pk.INTEGER_IDX,pkv.PART_KEY_VAL from PARTITION_KEYS pk,PARTITION_KEY_VALS pkv where pk.INTEGER_IDX=pkv.INTEGER_IDX and pk.TBL_ID=41231 and pkv.PART_ID=168301; +-----------+-----------+-------------+--------------+ | PKEY_NAME | PKEY_TYPE | INTEGER_IDX | PART_KEY_VAL | +-----------+-----------+-------------+--------------+ | log_date | string | 0 | 2013-03-01 | +-----------+-----------+-------------+--------------+
2.7 BUCKET 相关表
描述BUCKETING_COLS表描述了所有采用了分桶技术的SDS,目前公司未用BUCKET,//TODO
mysql> desc BUCKETING_COLS; +-----------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------+--------------+------+-----+---------+-------+ | SD_ID | bigint(20) | NO | PRI | NULL | | | BUCKET_COL_NAME | varchar(256) | YES | | NULL | | | INTEGER_IDX | int(11) | NO | PRI | NULL | | +-----------------+--------------+------+-----+---------+-------+