元数据分类与采集:技术元数据、业务元数据、管理元数据、元数据采集方法与工具

聊元数据治理,第一个绕不开的问题就是:元数据到底分几类?

我刚开始做数据治理项目时,也以为元数据就是“数据的数据”这么简单。结果一上手就懵了——业务部门问“这个字段啥意思”,技术部门问“这个表从哪里来的”,运维问“谁改过这个配置”。同一个“元数据”,不同人问的完全不是一回事。

所以,咱们得先把元数据分清楚。我个人习惯把它分成三大类:技术元数据、业务元数据、管理元数据。这三类各有各的用途,采集方式也不一样。

1. 技术元数据:数据工程师的“地图”

技术元数据,说白了就是描述数据怎么存、怎么算、怎么流转的那些信息。它是数据工程师最常打交道的部分。

技术元数据包含哪些?

  • 数据源信息:数据库类型、连接地址、端口、用户名(不存密码)
  • 表结构:表名、字段名、字段类型、长度、主键、外键、索引
  • ETL 作业信息:作业名称、调度频率、输入输出表、转换逻辑
  • 数据血缘:字段级、表级、作业级的上下游依赖关系
  • 存储信息:表空间大小、分区信息、文件路径、格式(Parquet/ORC/CSV)

我记得有一次排查一个报表数据不准的问题。业务说“昨天数据还是对的,今天就不对了”。我第一反应是查技术元数据——一看血缘图,发现上游有个 ETL 作业昨天被改过调度时间,导致数据没跑完就触发了下游任务。这就是技术元数据的价值:帮你快速定位问题根因。

2. 业务元数据:业务人员的“字典”

业务元数据解决的是“这个数据是什么意思”的问题。技术元数据告诉你字段名叫 cust_id,业务元数据告诉你这是“客户唯一标识,来自 CRM 系统”。

你想想看,如果没有业务元数据,业务人员看数据仓库里的表,就像看天书一样。字段名全是 col_001、f_amt 这种缩写,谁能看懂?

业务元数据典型内容:

  • 业务术语:比如“活跃用户”的定义是什么(7天内登录算活跃?还是30天内?)
  • 数据字典:字段的业务含义、取值范围、枚举值说明
  • 指标定义:比如“GMV”的计算口径(含不含退款?含不含税?)
  • 数据质量规则:比如“手机号字段必须符合11位数字格式”
  • 数据使用说明:这个表适合什么场景用,不适合什么场景用

我曾经在一个金融客户那里遇到一个经典案例。他们有个“逾期天数”字段,技术元数据里写的是 overdue_days INT。但业务部门说这个字段不准。一查才发现,业务元数据里根本没定义“逾期”的起点——是从应还日开始算?还是从宽限期结束后开始算?不同业务线口径不一样,数据自然对不上。

所以,业务元数据不是可有可无的装饰品,它是数据能真正被业务用起来的基石。

3. 管理元数据:运维和治理的“日志”

管理元数据关注的是数据谁在用、谁在管、什么时候改过。它更像是数据治理的“审计日志”。

管理元数据类别 具体内容 典型用途
权限信息 表的拥有者、读写权限、授权记录 权限审计、数据安全合规
变更历史 表结构变更记录、ETL 作业修改记录 问题回溯、变更影响分析
使用统计 表的访问频率、查询次数、最近访问时间 冷热数据识别、存储优化
数据质量监控 质量规则执行结果、异常记录、修复状态 数据质量持续改进
数据生命周期 数据创建时间、归档时间、销毁时间 合规存储、成本控制

注意:管理元数据经常被忽视。很多团队只采集技术元数据和业务元数据,结果出了问题找不到责任人,也不知道数据被谁改过。我建议从一开始就把管理元数据的采集纳入规划,不然后面补起来非常痛苦。

4. 元数据采集方法:从“手工”到“自动化”

元数据分类清楚了,下一步就是怎么把它采回来。采集方法我总结为三种模式:手工录入、接口采集、日志解析。

4.1 手工录入

最原始的方法,但某些场景下必不可少。比如业务术语的定义、数据质量规则的描述,这些“人肉知识”很难从系统里自动抽出来。

我建议:手工录入只用于业务元数据和管理元数据中的非结构化部分。技术元数据千万别靠手工,累死人还容易出错。

4.2 接口采集

这是最主流的方式。通过数据库的 JDBC/ODBC 接口、ETL 工具的 API、数据湖的 Catalog API 来拉取元数据。

-- 示例:通过 JDBC 采集 MySQL 表结构元数据
SELECT 
    TABLE_NAME,
    COLUMN_NAME,
    DATA_TYPE,
    CHARACTER_MAXIMUM_LENGTH,
    IS_NULLABLE,
    COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'your_database'
ORDER BY TABLE_NAME, ORDINAL_POSITION;

这段 SQL 我几乎每个项目都会用到。它从数据库的系统表里把表结构信息一次性拉出来,是技术元数据采集的“基本功”。

4.3 日志解析

有些元数据没法直接通过接口拿到,比如数据血缘中的字段级依赖关系。这时候就得靠解析 SQL 日志、ETL 作业日志来反向推导。

举个例子:你有一个 Hive SQL:

INSERT OVERWRITE TABLE dws.sales_summary
SELECT 
    product_id,
    SUM(amount) AS total_amount
FROM dwd.sales_detail
WHERE dt = '2024-01-01'
GROUP BY product_id;

通过解析这条 SQL,可以自动推导出:dws.sales_summary.product_id 来源于 dwd.sales_detail.product_id,dws.sales_summary.total_amount 来源于 dwd.sales_detail.amount 的聚合。这就是字段级血缘的自动采集原理。

5. 元数据采集工具选型

工具选型这块,我踩过不少坑。简单说说主流工具的特点:

工具 适用场景 优点 缺点
Apache Atlas Hadoop 生态 与 Hive/HBase/Kafka 深度集成,支持血缘自动采集 部署复杂,性能一般
DataHub 多数据源混合 现代化 UI,支持实时采集,社区活跃 对传统数据库支持较弱
Apache Metron 安全分析场景 流式处理能力强 元数据治理功能有限
自研采集器 定制化需求高 完全可控,适配任意数据源 开发成本高,维护压力大

我个人建议:中小团队优先用 DataHub 或 Atlas,别一上来就自研。我见过太多团队花半年自研采集器,结果功能还没开源工具完善。除非你的数据源非常特殊(比如自研的存储引擎),否则没必要重复造轮子。

6. 一张图看懂元数据分类与采集

下面这张图是我自己总结的,把三类元数据、采集方法和工具串在了一起。你可以把它当作本章的知识框架图。

元数据分类与采集全景图 技术元数据 业务元数据 管理元数据 表结构 / 字段类型 ETL 作业 / 调度信息 数据血缘 / 存储路径 分区 / 索引 / 约束 业务术语 / 数据字典 指标定义 / 计算口径 质量规则 / 校验逻辑 使用说明 / 业务场景 权限信息 / 访问记录 变更历史 / 版本管理 使用统计 / 冷热数据 生命周期 / 合规审计 手工录入 接口采集 日志解析 Apache Atlas DataHub 自研采集器 核心原则:技术元数据尽量自动化采集,业务元数据需要人工维护,管理元数据靠系统日志持续积累

7. 避坑指南:我踩过的三个坑

最后分享几个实战中容易踩的坑,希望能帮你少走弯路。

坑一:只采技术元数据,忽略业务元数据

我曾经在一个项目里,花了两周把全公司的技术元数据都采回来了,表结构、血缘、调度信息一应俱全。结果业务部门根本不买账——他们看不懂。后来补业务元数据又花了一个月,而且很多口径已经没人说得清了。所以,技术元数据和业务元数据要同步推进,别等后面再补。

坑二:采集频率设置不合理

有个客户每天全量采集一次元数据,结果数据量太大,采集作业跑了两小时,把生产库都拖慢了。后来改成增量采集+每日全量,才解决问题。我建议:技术元数据按变更频率设采集周期——表结构变化少的每周一次,ETL 作业变化多的每天一次。

坑三:血缘采集只做表级,不做字段级

表级血缘只能告诉你“这个表依赖那个表”,但字段级血缘才能告诉你“这个字段是怎么算出来的”。我建议一开始就做字段级血缘采集,虽然解析 SQL 的工作量大一些,但后面排查问题的效率会高很多。