元数据管理-技术元数据解决方案
前言
概念
元数据是描述企业数据相关的数据,指在IT系统建设过程中所产生的有关数据定义,目标定义,转换规则等相关的关键数据,包括对数据的业务、结构、定义、存储、安全等各方面对数据的描述
元数据是数仓建设环节中不可缺少的一部分(尤其是在数据治理环节),是数据管理、数据内容、数据应用的基础。通过元数据可以打通数据源、数据仓库、数据应用、记录了数据流向的完整链路。它可以说是企业的数据地图,可以直接反映了企业中有什么样的数据,这些数据是如何存放的,以及数据之间的关系是如何的。
分类
参考Kimball的数仓模型理论,可以把元数据分为三类:
技术元数据,比如表结构、字段定义、文件存储等信息
业务元数据,比如业务定义、业务术语、业务规则、业务指标等
管理元数据,比如数据所有者、数据质量定责、数据安全等级等
链路
整个元数据链路分为元数据采集、元数据管理、元数据应用。
基于获取到的元数据可以实现血缘关系、权限的监控、全局监控数据完整生命周期等等。
最后通过这些功能实现一般会形成产品化,比较常见的就是数据地图、数据检索和数据质量分析。
技术元数据
目前大多数公司的数仓建设是基于Hive进行的,而Hive又是依托于Hadoop为引擎做存储计算,当然Hive元数据默认是存储在Derby数据库中的,不过在生产环境下一般都是改为mysql存储。本篇先为大家介绍一下技术元数据相关内容,以及结合笔者实际工作中使用到的场景进行结合讲解。
首先大家先看一下整体的ER模型图(这里主要是想告诉大家涉及到表非常多,大家可以自行连接元数据库进行查看),不过这里只讲解几个比较常用的
应用场景
刚才简单提及到了元数据的相关应用,比如血缘关系、权限的监控、全局监控数据完整生命周期等等。
这里笔者给出公司目前基于元数据所实现的一些功能,例如数据质量监控、数据地图等。因涉及到隐私安全问题,笔者给出一些截图供读者参考,主要是一些质控、元数据信息管理的功能
关于数据质量这块,后面会有单独的篇幅文章进行讲解,主要涉及到一些质控规则的内容
需求背景
这里给出一个笔者正在做的一个需求并结合元数据进行讲解,以此来简述在日常工作中是如何使用元数据来帮助我们提升效率的。
早期公司使用ELK采集日志并入仓,但随着业务规模扩张以及数据量的暴涨,ELK这套体系显得过于笨重,且日志出入口比较复杂,为了统一采集入口,规范日志流程,提升日志数据质量,现将日志采集由logstash迁移至日志中心,由于采集的数据直接写入到了ods层,基于数据可靠性以及用户无感知的原则,在正式切换新老程序之前,需要比对数据一致(这里对原始ods表复制了一个新表,来存储新采集流程的数据)。
那么这里就有了两个问题
如何对新老表进行比对来验证两个表数据一致呢?
由于ods层的表不止一两张,如何快速的比对呢?
需求开发
基于上面的两个问题,笔者这里给出目前的解决方案,可能不是最优解,如果读者有好的解决方案可以随时交流
针对第一个问题,当两个表的数据量一致,且每个字段值也一致,那么才说明是两个表是一致的
对于数据量,其实就是通过count计算
对于每个字段的值比较,不可能人肉去比对,笔者这里是将所有字段做了一个拼接,然后取md5值,最后对md5值作比较
针对第二个问题,当对大量表做比对的时候,人肉方式是不可能的,否则绝对加班到昏天暗地,只能通过自动化脚本来实现。
笔者将需要比对的表进行手动配置到一个文件,然后通过读取元数据的方式来自动完成拼接比对
那么具体的流程如下:
读取配置文件,获取新老表(即原表和新迁移后的表)
根据表名读取元数据获取所有的字段进行拼接(这里需要保证字段的顺序,而且需要注意元数据的更新情况),然后取md5值
然后就是sql拼接了,执行sql得到最后的比对结果,笔者这里是采用邮件发送的方式(整个耗时大概不到十分钟就完成了)
这里给出读取元数据的部分代码
1select 2 distinct concat('{{',concat_ws(',',collect_list(concat('"',tab_name,'":"',concat_column,'"'))),'}}') as result3from 4(5 select 6 distinct concat_ws('.',schema_name,table_name) as tab_name,7 concat(8 'md5(concat(',9 concat_ws(
10 ',',
11 sort_array(
12 collect_set(
13 case when type_name='boolean' then concat('coalesce(',column_name,',false)') else concat('coalesce(',column_name,",'-99')") end
14 ) over(partition by concat_ws('.',schema_name,table_name))
15 )
16 )
17 ,'))'
18 ) as concat_column
19 from
20 (
21 select
22 t.name as schema_name,
23 t1.tbl_name as table_name,
24 t4.column_name,
25 t4.type_name
26 from dbs t
27 join tbls t1
28 on t.db_id = t1.db_id and t.date_id = '2020-09-26' and t1.date_id = '2020-09-26'
29 left join partitions t2
30 on t1.tbl_id = t2.tbl_id and t2.date_id = '2020-09-26'
31 left join sds t3
32 on t2.sd_id = t3.sd_id and t3.date_id = '2020-09-26'
33 left join (select * from columns_v2 where date_id='2020-09-26') t4
34 on t3.cd_id= t4.cd_id
35 where t.name='wedw_ods' and t1.tbl_name in ('tab_name')
36 group by t.name ,t1.tbl_name,t4.column_name,t4.type_name
37 )t
38)res
最后给出一张最后的效果图
元数据库表
存储Hive版本的元数据表(VERSION)
VER_ID | SCHEMA_VERSION | VERSION_COMMENT |
---|---|---|
ID主键 | Hive版本 | 版本说明 |
1 | 2.3.0 | Hive release version 2.3.0 |
注意:该表不存在时,将无法进入cli模式
Hive数据库相关的元数据表(DBS,DATABASE_PARAMS)
DBS:存储Hive中所有数据库基本信息
该表的DB_ID字段也是 FUNC_RU、FUNCS、DB_PRIVS、DATABASE_PARAMS、以及TBLS的外键
元数据字段 | 说明 | 示例 |
---|---|---|
DB_ID | 数据库ID | 1 |
DESC | 数据库描述 | Default Hive database |
DB_LOCATION_URI | 数据库HDFS路径 | hdfs://emr-cluster/user/hive/warehouse |
NAME | 数据库名 | default |
OWNER_NAME | 数据库所有者用户名 | public |
OWNER_TYPE | 所有者角色 | ROLE |
DATABASE_PARAMS:存储数据库的相关参数
元数据库字段 | 说明 | 示例数据 |
---|---|---|
DB_ID | 数据库ID | |
PARAM_KEY | 参数名 | |
PARAM_VALUE | 参数值 |
DB_PRIVS:存储数据库的授权信息
元数据库字段 | 说明 | 示例数据 |
---|---|---|
DB_GRANT_ID | 授权ID | |
CREATE_TIME | 授权时间 | |
DB_ID | 数据库ID | |
GRANT_OPTION | ||
GRANTOR | 授权执行用户 | |
GRANTOR_TYPE | 授权者类型 | |
PRINCIPAL_NAME | 被授权用户 | |
PRINCIPAL_TYPE | 被授权用户类型 | |
DB_PRIV | 权限 | |
AUTHORIZER |
Hive表和视图相关的元数据表
TBLS:该表存储HIve表、视图、索引表的基本信息
元数据表字段 | 说明 | 示例数据 |
---|---|---|
TBL_ID | 表ID | 3 |
CREATE_TIME | 创建时间 | 1542359066 |
DB_ID | 数据库ID | 5 |
LAST_ACCESS_TIME | 上次访问时间 | 0 |
OWNER | 所有者 | hadoop |
RETENTION | 保留字段 | 0 |
SD_ID | 序列化配置信息 | 3 |
TBL_NAME | 表名 | t_dsp_mart_bankcard_location |
TBL_TYPE | 表类型 | MANAGED_TABLE |
VIEW_EXPANDED_TEXT | 视图的详细HQL语句 | NULL |
VIEW_ORIGINAL_TEXT | 视图的原始HQL语句 | NULL |
IS_REWRITE_ENABLED | 是否开启重写 |
TABLE_PARAMS:该表存储表/视图的属性信息
元数据字段 | 说明 | 示例 |
---|---|---|
TBL_ID | 表ID | 3 |
PARAM_KEY | 属性名 | transient_lastDdlTime |
PARAM_VALUE | 属性值 | 1542359066 |
TBL_PRIVS:存储表/视图的授权信息
元数据字段 | 说明 | 示例 |
---|---|---|
TBL_GRANT_ID | 授权ID | 14 |
CREATE_TIME | 授权时间 | 1542359066 |
GRANT_OPTION | 1 | |
GRANTOR | 授权执行用户 | hadoop |
GRANTOR_TYPE | 授权者类型 | USER |
PRINCIPAL_NAME | 被授权用户 | hadoop |
PRINCIPAL_TYPE | 被授权用户类型 | USER |
TBL_PRIV | 权限 | INSERT |
TBL_ID | 表ID | 3 |
Hive文件存储信息相关的元数据表
SDS:保存文件存储的基本信息
元数据字段 | 说明 | 示例 |
---|---|---|
SD_ID | 存储信息ID | 3 |
CD_ID | 字段信息ID | 3 |
INPUT_FORMAT | 文件输入格式 | org.apache.hadoop.mapred.TextInputFormat |
IS_COMPRESSED | 是否压缩 | |
IS_STOREDASSUBDIRECTORIES | 是否以子目录存储 | |
LOCATION | HDFS路径 | hdfs://emr-cluster/user/hive/warehouse/dspdb.db/t_dsp_mart_bankcard_location |
NUM_BUCKETS | 分桶数量 | -1 |
OUTPUT_FORMAT | 文件输出格式 | org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat |
SERDE_ID | 序列化类ID | 3 |
SD_PARAMS:存储Hive存储的属性信息
元数据字段 | 说明 | 示例 |
---|---|---|
SD_ID | 存储配置ID | |
PARAM_KEY | 存储属性名 | |
PARAM_VALUE | 存储属性值 |
SERDES:存储序列化使用的类信息
元数据字段 | 说明 | 示例 |
---|---|---|
SERDE_ID | 序列化类配置ID | 3 |
NAME | 序列化类别名 | NULL |
SLIB | 序列化类 | org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe |
SERDE_PARAMS:存储序列化的一些属性、格式信息
元数据字段 | 说明 | 示例 |
---|---|---|
SERDE_ID | 序列化类配置ID | 3 |
PARAM_KEY | 属性名 | field.delim |
PARAM_VALUE | 属性值 |
Hive表字段相关的元数据表
COLUMNS_V2:存储表对应的字段信息
元数据字段 | 说明 | 示例 |
---|---|---|
CD_ID | 字段信息ID | 3 |
COMMENT | 字段注释 | NULL |
COLUMN_NAME | 字段名 | bankcode |
TYPE_NAME | 字段类型 | string |
INTEGER_IDX | 字段顺序 | 2 |
Hive表分区相关的元数据表
PARTITIONS:存储表分区的基本信息
元数据字段 | 说明 | 示例 |
---|---|---|
PART_ID | 分区ID | 2 |
CREATE_TIME | 分区创建时间 | 1542697377 |
LAST_ACCESS_TIME | 最后一次访问时间 | 0 |
PART_NAME | 分区名 | dt=2018-11-19 |
SD_ID | 分区存储ID | 47 |
TBL_ID | 表ID | 30 |
PARTITION_KEY_VALS:存储分区字段值
元数据字段 | 说明 | 示例 |
---|---|---|
PART_ID | 分区ID | 2 |
PART_KEY_VAL | 分区字段值 | 2018-11-19 |
INTEGER_IDX | 分区字段值顺序 | 0 |
PARTITION_PARAMS:存储分区的属性信息
元数据字段 | 说明 | 示例 |
---|---|---|
PART_ID | 分区ID | 2 |
PARAM_KEY | 分区属性名 | numFiles |
PARAM_VALUE | 分区属性值 | 12 |
最后说一句
结合笔者的需求,可以看到元数据的强大之处。当然使用元数据的场景还有很多,笔者也是初次涉猎,有些内容可能描述的不是很恰当得体,如果读者对元数据有兴趣或者目前正在做元数据这块内容,强烈欢迎读者在讨论区写下你的想法。
最后祝各位读者假期快乐,但也不要忘记学习哦,接下来笔者也会有空余时间来整理一些关于面试和数仓建模相关的文章来分享给大家。
元数据管理-技术元数据解决方案相关推荐
- 深度 | 面向云原生数据湖的元数据管理技术解析
简介: 作者:沐远.明惠 背景 数据湖当前在国内外是比较热的方案,MarketsandMarkets市场调研显示预计数据湖市场规模在2024年会从2019年的79亿美金增长到201亿美金.一些企业已经 ...
- 数据治理:元数据及元数据管理策略、方法和技术
导读:这篇文章来自笔者的<一本书讲透数据治理:战略.方法.工具与实践>,可能是电子版流出,不知被哪位大佬摘录到公众号上了.在公众号搜索了下,这篇文章还挺受欢迎,多个数据类公众号都转载了,全 ...
- 元数据管理——企业数据治理的基石
数字化时代,不少企业开始数字化转型,开始收集整理数据,但在使用途中,通常会发生数据泄露,安全没办法得到保障:数字管理混乱,查找困难,无效失效数据偏多:数据流程复杂,流程不畅,无法有效赋能业务. 这些 ...
- 【收藏】关于元数据(Metadata)和元数据管理,这是我的见过最全的解读!
本文主要从元数据的定义.作用.元数据管理现状.管理标准和元数据管理功能等方面讲述了我对元数据(Metadata)和元数据管理的认知及理解. 元数据管理 一.元数据的定义 按照传统的定义,元数据(Met ...
- 《DAMA数据管理知识体系指南》读书笔记-第十二章(元数据管理)
目录 一.前言 二.内容结构 三.主要内容 1.引言 2.活动 3.工具 4.方法 5.实施指南 6.元数据治理 四.思考与总结 一.前言 本文是<DAMA数据管理知识体系指南>第12章的 ...
- 数据仓库与元数据管理
数据仓库与元数据管理 1. 前言 在事务处理系统中的数据,主要用于记录和查询业务情况.随着数据仓库(DW)技术的不断成熟,企业的数据逐渐变成了决策的主要依据.数据仓库中的数据是从许多业务处理系统中抽取 ...
- 元数据管理、治理、系统、建设方案、范例等
[数据治理工具]–元数据系统 1.元数据系统 1.1 概述 如果想建设好元数据系统,需要理解元数据系统的相关概念,如数据.数据模型.元数据.元模型.ETL.数据血缘等等. 首先,要清楚数据的定义.数据 ...
- CDGA 认证-第十二章 元数据管理(重点章节)习题集解析
1. 以下内容不属于元数据综合解决方案功能需求点的是 ( ) A 历史信息 B 存储容量 C 运维要求 D 安全要求 [答案解析]DAMA-DMBOK2 P334 2. 关于 ISO/IEC 1117 ...
- 数据治理系列2:元数据管理—企业数据治理的基础
导读:元数据管理是对企业涉及的业务元数据.技术元数据.管理元数据进行盘点.集成和管理,按照科学.有效的机制对元数据进行管理,并面向开发人员.最终用户提供元数据服务,以满足用户的业务需求,对企业业务系统 ...
最新文章
- python计算机_基础python计算机知识
- c++把数组所有元素剔除_C语言基础之数组,第一节,C语言必学知识点剖析
- 第 4 章 Hypertable
- Matlab---傅里叶变换---通俗理解(一)
- 520 钻石争霸赛 7-6 矩阵列平移(循环)
- matlab填充点面,求大神指点绘制空间内散点图的包络面,,,散点程序如下
- JavaScript语言精粹笔记
- bzoj 1627: [Usaco2007 Dec]穿越泥地(BFS)
- 数学与应用数学考研计算机方向,数学专业考研方向解析:应用数学
- 5月18日第壹简报,星期三,农历四月十八
- 教你如何做一个三角形
- Windows2008R2操作系统日志清理
- 25篇经典机器学习论文的分类
- Word将一个文档模板的样式复制到另外一个文档
- 第七章 - 直方图与匹配 - 直方图的计算与显示(cvCalcHist)
- 点开瞅瞅,再来几道Python面试题吧,Python面试题No20
- Java代码混淆工具-ProGuard
- Web of Science爬虫实战(Post方法)
- c语言课程建设与改革,推进课程建设,助力教学改革
- Mysql添加用户,访问指定数据库