4、批式数据血缘特点:确定性、分区与追溯
批式数据血缘,说白了就是离线数仓里的“家谱”。
我做了这么多年数据治理,最深的感受是:批式血缘虽然看起来“笨”,但它其实是最靠谱的。为什么?因为它有确定性。你想想看,流式数据还在那儿“嘀嗒嘀嗒”地跑,批式任务跑完就固定了,输入输出都是板上钉钉的事。
4.1 批式数据的确定性
批式任务的核心特征就是——输入确定、输出确定、执行计划确定。一次跑完,结果就摆在那儿,不会变。
确定性带来的好处:
- 血缘可复现:同样的输入,同样的代码,跑出来的血缘关系一模一样
- 回溯无歧义:查某个字段的来源,路径是唯一的,不会出现“这次是A表,下次是B表”的情况
- 影响分析准确:改一个上游表,下游哪些表会受影响,一算一个准
我在项目中遇到过一件事:有个同事非要用流式引擎跑批式任务,结果血缘关系天天变,查问题查了三天。后来我让他换回批式调度,血缘一下子就清晰了。说白了,批式就是“一次成型”,流式是“持续变化”,两者在血缘上的处理逻辑完全不同。
4.2 分区与血缘
批式数据里,分区是个绕不开的话题。Hive 表按天分区、按小时分区,甚至按业务维度分区,都很常见。
那分区怎么影响血缘?
我举个例子:一张订单表 ods_orders,按 dt 分区。ETL 任务只读取 dt='2024-01-01' 这个分区,写入到 dwd_order_detail 的 dt='2024-01-01' 分区。这时候,血缘关系应该是“分区级别”的,而不是“表级别”的。
我的建议:血缘解析一定要做到分区粒度。表级别的血缘太粗,根本没法做精准的影响分析。你改了一个分区,结果告诉你整张表都受影响,那这血缘就没意义了。
分区血缘的常见模式:
| 血缘粒度 | 描述 | 适用场景 |
|---|---|---|
| 表级血缘 | 只记录表与表之间的依赖 | 全量刷新、小表 |
| 分区级血缘 | 记录具体分区之间的依赖 | 增量更新、大表、分区表 |
| 字段级血缘 | 记录字段到字段的映射 | 数据溯源、质量监控 |
我个人习惯,在批式场景下至少做到“分区级+字段级”的血缘。分区级解决“哪个分区依赖哪个分区”,字段级解决“这个字段怎么来的”。两者结合,血缘才算完整。
4.3 批式血缘的追溯方式
批式血缘怎么追溯?说白了就是“逆向查”。从一张结果表,一路往上找,找到原始数据。
常见的追溯方式有三种:
- SQL 解析追溯:解析 ETL 任务的 SQL,提取
INSERT ... SELECT中的字段映射关系。这是最基础的方式。 - 日志解析追溯:从 Spark/Hive 的执行日志里,提取输入输出路径。适合复杂任务,但解析成本高。
- 元数据采集追溯:通过 Hook 或 Listener,在任务执行时主动采集血缘信息。实时性好,但需要改造调度系统。
我曾经踩过的坑:只依赖 SQL 解析,结果遇到存储过程、UDF、动态 SQL,解析出来的血缘全是错的。后来我改成“SQL 解析 + 日志校验”双通道,准确率才上来。记住,没有一种方式能覆盖所有场景。
下面这张图,是我在实际项目中总结的批式血缘追溯流程:
你看,批式血缘的追溯其实是个“先分后合”的过程。SQL 解析和日志解析并行跑,各自产出血缘片段,最后合并去重。这样既能覆盖简单 SQL,也能兜底复杂任务。
嗯,这里要注意一点:合并的时候,以日志解析为准。因为日志是实际执行记录,SQL 解析只是静态分析。两者冲突时,信日志不信代码。
4.4 批式血缘的存储模型
批式血缘怎么存?我见过不少团队直接用关系表存,结果查询性能一塌糊涂。我的做法是:用图数据库存血缘关系,用关系表存元数据。
举个例子:
-- 血缘关系表(图数据库)
CREATE TABLE lineage_edges (
upstream_table STRING,
upstream_partition STRING,
upstream_field STRING,
downstream_table STRING,
downstream_partition STRING,
downstream_field STRING,
job_id STRING,
run_time TIMESTAMP
);
-- 元数据表(关系数据库)
CREATE TABLE table_meta (
table_name STRING,
db_name STRING,
partition_col STRING,
owner STRING,
create_time TIMESTAMP
);
我的经验:图数据库查血缘快,但存不了太多属性。关系表存属性方便,但查多跳关系慢。两者互补,别混在一起用。
批式血缘的特点,总结下来就是三句话:
- 确定性高:跑完就不变了,血缘可复现
- 分区敏感:必须做到分区粒度,否则影响分析不准
- 追溯方式多:SQL 解析、日志解析、元数据采集,各有优劣,建议组合使用