查看原文
其他

元数据管理-技术元数据解决方案

程序媛媛看这里 进击吧大数据 2022-07-01


点击上方蓝字  关注大数据知识

前言

概念

元数据是描述企业数据相关的数据,指在IT系统建设过程中所产生的有关数据定义,目标定义,转换规则等相关的关键数据,包括对数据的业务、结构、定义、存储、安全等各方面对数据的描述

元数据是数仓建设环节中不可缺少的一部分(尤其是在数据治理环节),是数据管理、数据内容、数据应用的基础。通过元数据可以打通数据源、数据仓库、数据应用、记录了数据流向的完整链路。它可以说是企业的数据地图,可以直接反映了企业中有什么样的数据,这些数据是如何存放的,以及数据之间的关系是如何的

分类

参考Kimball的数仓模型理论,可以把元数据分为三类:

  1. 技术元数据,比如表结构、字段定义、文件存储等信息

  2. 业务元数据,比如业务定义、业务术语、业务规则、业务指标等

  3. 管理元数据,比如数据所有者、数据质量定责、数据安全等级等

链路

整个元数据链路分为元数据采集、元数据管理、元数据应用。

基于获取到的元数据可以实现血缘关系、权限的监控、全局监控数据完整生命周期等等。

最后通过这些功能实现一般会形成产品化,比较常见的就是数据地图、数据检索和数据质量分析。

技术元数据

目前大多数公司的数仓建设是基于Hive进行的,而Hive又是依托于Hadoop为引擎做存储计算,当然Hive元数据默认是存储在Derby数据库中的,不过在生产环境下一般都是改为mysql存储。本篇先为大家介绍一下技术元数据相关内容,以及结合笔者实际工作中使用到的场景进行结合讲解。

首先大家先看一下整体的ER模型图(这里主要是想告诉大家涉及到表非常多,大家可以自行连接元数据库进行查看),不过这里只讲解几个比较常用的

应用场景

刚才简单提及到了元数据的相关应用,比如血缘关系、权限的监控、全局监控数据完整生命周期等等。

这里笔者给出公司目前基于元数据所实现的一些功能,例如数据质量监控、数据地图等。因涉及到隐私安全问题,笔者给出一些截图供读者参考,主要是一些质控、元数据信息管理的功能

关于数据质量这块,后面会有单独的篇幅文章进行讲解,主要涉及到一些质控规则的内容

需求背景

这里给出一个笔者正在做的一个需求并结合元数据进行讲解,以此来简述在日常工作中是如何使用元数据来帮助我们提升效率的。

早期公司使用ELK采集日志并入仓,但随着业务规模扩张以及数据量的暴涨,ELK这套体系显得过于笨重,且日志出入口比较复杂,为了统一采集入口,规范日志流程,提升日志数据质量,现将日志采集由logstash迁移至日志中心,由于采集的数据直接写入到了ods层,基于数据可靠性以及用户无感知的原则,在正式切换新老程序之前,需要比对数据一致(这里对原始ods表复制了一个新表,来存储新采集流程的数据)。

那么这里就有了两个问题

  1. 如何对新老表进行比对来验证两个表数据一致呢?

  2. 由于ods层的表不止一两张,如何快速的比对呢?

需求开发

基于上面的两个问题,笔者这里给出目前的解决方案,可能不是最优解,如果读者有好的解决方案可以随时交流

针对第一个问题,当两个表的数据量一致,且每个字段值也一致,那么才说明是两个表是一致的

  • 对于数据量,其实就是通过count计算

  • 对于每个字段的值比较,不可能人肉去比对,笔者这里是将所有字段做了一个拼接,然后取md5值,最后对md5值作比较

针对第二个问题,当对大量表做比对的时候,人肉方式是不可能的,否则绝对加班到昏天暗地,只能通过自动化脚本来实现。

  • 笔者将需要比对的表进行手动配置到一个文件,然后通过读取元数据的方式来自动完成拼接比对

那么具体的流程如下:

  1. 读取配置文件,获取新老表(即原表和新迁移后的表)

  2. 根据表名读取元数据获取所有的字段进行拼接(这里需要保证字段的顺序,而且需要注意元数据的更新情况),然后取md5值

  3. 然后就是sql拼接了,执行sql得到最后的比对结果,笔者这里是采用邮件发送的方式(整个耗时大概不到十分钟就完成了)

这里给出读取元数据的部分代码

1select 
2  distinct concat('{{',concat_ws(',',collect_list(concat('"',tab_name,'":"',concat_column,'"'))),'}}') as result
3from 
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_IDSCHEMA_VERSIONVERSION_COMMENT
ID主键Hive版本版本说明
12.3.0Hive release version 2.3.0

注意:该表不存在时,将无法进入cli模式

Hive数据库相关的元数据表(DBS,DATABASE_PARAMS)
DBS:存储Hive中所有数据库基本信息

该表的DB_ID字段也是 FUNC_RU、FUNCS、DB_PRIVS、DATABASE_PARAMS、以及TBLS的外键

元数据字段说明示例
DB_ID数据库ID1
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表ID3
CREATE_TIME创建时间1542359066
DB_ID数据库ID5
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表ID3
PARAM_KEY属性名transient_lastDdlTime
PARAM_VALUE属性值1542359066
TBL_PRIVS:存储表/视图的授权信息
元数据字段说明示例
TBL_GRANT_ID授权ID14
CREATE_TIME授权时间1542359066
GRANT_OPTION
1
GRANTOR授权执行用户hadoop
GRANTOR_TYPE授权者类型USER
PRINCIPAL_NAME被授权用户hadoop
PRINCIPAL_TYPE被授权用户类型USER
TBL_PRIV权限INSERT
TBL_ID表ID3
Hive文件存储信息相关的元数据表
SDS:保存文件存储的基本信息
元数据字段说明示例
SD_ID存储信息ID3
CD_ID字段信息ID3
INPUT_FORMAT文件输入格式org.apache.hadoop.mapred.TextInputFormat
IS_COMPRESSED是否压缩
IS_STOREDASSUBDIRECTORIES是否以子目录存储
LOCATIONHDFS路径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序列化类ID3
SD_PARAMS:存储Hive存储的属性信息
元数据字段说明示例
SD_ID存储配置ID
PARAM_KEY存储属性名
PARAM_VALUE存储属性值
SERDES:存储序列化使用的类信息
元数据字段说明示例
SERDE_ID序列化类配置ID3
NAME序列化类别名NULL
SLIB序列化类org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
SERDE_PARAMS:存储序列化的一些属性、格式信息
元数据字段说明示例
SERDE_ID序列化类配置ID3
PARAM_KEY属性名field.delim
PARAM_VALUE属性值
Hive表字段相关的元数据表
COLUMNS_V2:存储表对应的字段信息
元数据字段说明示例
CD_ID字段信息ID3
COMMENT字段注释NULL
COLUMN_NAME字段名bankcode
TYPE_NAME字段类型string
INTEGER_IDX字段顺序2
Hive表分区相关的元数据表
PARTITIONS:存储表分区的基本信息
元数据字段说明示例
PART_ID分区ID2
CREATE_TIME分区创建时间1542697377
LAST_ACCESS_TIME最后一次访问时间0
PART_NAME分区名dt=2018-11-19
SD_ID分区存储ID47
TBL_ID表ID30
PARTITION_KEY_VALS:存储分区字段值
元数据字段说明示例
PART_ID分区ID2
PART_KEY_VAL分区字段值2018-11-19
INTEGER_IDX分区字段值顺序0
PARTITION_PARAMS:存储分区的属性信息
元数据字段说明示例
PART_ID分区ID2
PARAM_KEY分区属性名numFiles
PARAM_VALUE分区属性值12

最后说一句

结合笔者的需求,可以看到元数据的强大之处。当然使用元数据的场景还有很多,笔者也是初次涉猎,有些内容可能描述的不是很恰当得体,如果读者对元数据有兴趣或者目前正在做元数据这块内容,强烈欢迎读者在讨论区写下你的想法。
最后祝各位读者假期快乐,但也不要忘记学习哦,接下来笔者也会有空余时间来整理一些关于面试和数仓建模相关的文章来分享给大家。

一万字完整总结Flume
SparkStreaming完整学习教程

数仓利器-Hive高频函数合集

2020年大厂面试题-数据仓库篇

zookeeper源码解读之-DataTree模型构建+Leader选举

zookeeper源码解读之-服务端启动流程

一段SQL简述鬼谷子问徒问题

实战:如何实时采集上亿级别数据?

Spark数据倾斜之骚操作解决方案

0006-01-01 Kafka深度剖析HW以及LEO

0004-01-03 Livy REST 提交Spark作业

数据同步神器-Datax源码重构

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存