4. 数据血缘分析:血缘采集、血缘解析、血缘可视化
数据血缘,说白了就是数据的「身世档案」。
你拿到一张报表,里面的销售额是 1.2 亿。这 1.2 亿从哪来?是哪个业务系统的订单?经过了哪些清洗、聚合、转换?中间有没有被截胡或者算错?
我刚开始做数据治理的时候,最怕的就是业务方拿着报表来问:「这个数不对啊,你们是不是算错了?」然后我得花半天时间,翻代码、查日志、问同事,才能搞清楚数据是怎么流过来的。那感觉,就像在黑暗里摸象。
数据血缘分析,就是给数据装上「GPS」。它能告诉你:数据从哪来、经过了谁、变成了什么样、最终去了哪。
4.1 血缘采集:把「数据地图」的原材料搬回来
血缘采集,是第一步。你得先把数据流动的「痕迹」收集起来。
这些痕迹藏在哪?
- SQL 脚本:ETL 脚本、存储过程、视图定义。这是最主流的来源。
- 数据集成工具:比如 DataX、Kettle、Informatica 的作业定义。
- 数据仓库元数据:表结构、字段注释、分区信息。
- 日志文件:Spark 或 Flink 的执行计划日志。
- 代码仓库:Git 里的数据管道代码。
采集方式,我一般分两种:
| 采集方式 | 原理 | 适用场景 | 我的经验 |
|---|---|---|---|
| 主动上报 | 数据平台在任务执行时,主动把血缘信息推送到血缘系统 | 自研数据平台、实时流处理 | 准确度高,但需要改造现有系统 |
| 被动扫描 | 定时扫描 SQL 脚本、日志文件,解析出血缘关系 | 存量系统、第三方工具 | 无侵入,但解析难度大 |
采集频率怎么定?
- 全量采集:每天凌晨跑一次,适合离线数仓。
- 增量采集:任务执行完就触发采集,适合实时场景。
- 事件驱动:只有元数据变更时才采集,适合稳定环境。
我曾经在一个项目里,因为采集频率设得太低,导致业务方看到的数据血缘还是三天前的。他们查了半天,发现源头表早就改名了。嗯,从那以后,我坚持用事件驱动 + 增量采集的组合。
4.2 血缘解析:把「原材料」变成「血缘关系」
采集回来的东西,是原始素材。你得把它解析成结构化的血缘关系。
解析的核心,是理解数据是怎么「流动」的。说白了,就是搞清楚:
- 哪个表(字段)是输入?
- 哪个表(字段)是输出?
- 经过了什么操作(过滤、聚合、关联)?
解析的难点在哪?我列几个常见的坑:
- SQL 方言:Hive SQL、Spark SQL、MySQL SQL 语法不一样。解析器得兼容。
- 存储过程:里面可能嵌套循环、条件分支、临时表。解析起来像在解一团乱麻。
- 字段级血缘:表级血缘好做,字段级很难。比如
SELECT a.col1 + b.col2 AS c,你得知道 c 依赖了 a.col1 和 b.col2。 - 中间表:很多 ETL 会创建临时表,然后 drop 掉。血缘里要不要保留?我建议保留,否则链路会断。
解析后的血缘关系,我一般用三元组表示:
{
"source": "ods.order_detail.order_amount",
"target": "dws.daily_sales.total_amount",
"operation": "SUM",
"transform": "SELECT SUM(order_amount) FROM ods.order_detail"
}
你想想看,如果每个字段的血缘都能解析成这样,那数据出问题的时候,定位根因就是秒级的事。
4.3 血缘可视化:让「数据地图」看得懂
解析出来的血缘关系,是一堆 JSON 或数据库记录。业务方看不懂,甚至很多开发也懒得看。
所以,得把它画出来。
血缘可视化,我踩过不少坑。最开始我用的是 D3.js,画出来的图很炫,但节点一多就卡死。后来换成力导向图,稍微好点,但用户还是抱怨「线太多,看不清」。
我的经验是:血缘可视化,核心不是「炫」,而是「清晰」。
几个设计原则:
- 分层展示:按数据层级(ODS、DWD、DWS、ADS)分层。用户想看哪层点哪层。
- 按需展开:默认只展示表级血缘。想看字段级,点击展开。
- 高亮链路:选中某个字段,高亮它的上下游链路。其他无关节点变灰。
- 搜索定位:支持按表名、字段名搜索。直接定位到目标节点。
- 变更标记:如果某个表或字段最近有变更,用特殊颜色标记出来。
下面是我画的一张血缘可视化框架图,展示了从采集到展示的完整链路:
4.4 血缘分析的实战价值
说了这么多,血缘分析到底能解决什么问题?
- 问题溯源:报表数据异常,顺着血缘链路找到源头表,发现是上游业务系统数据没同步。
- 变更影响分析:要改某个源表字段,先看血缘,知道下游有哪些表、报表、API 会受影响。
- 数据质量监控:在血缘链路的每个节点设置质量规则,异常时自动告警。
- 合规审计:监管要求提供数据来源证明,血缘就是最好的证据。
- 数据资产盘点:通过血缘,找出哪些表是「孤岛」(没有下游依赖),哪些表是「热点」(被大量下游引用)。
我记得有一次,业务方说某个核心报表的数据连续三天对不上。我打开血缘系统,从报表字段一路往下追,发现是中间层的一个 ETL 任务改了关联条件,但没通知任何人。从定位问题到修复,只花了 15 分钟。业务方都惊了:「你们怎么这么快?」
嗯,这就是血缘分析的价值。