订阅更新

元数据管理怎么做?血缘到底有什么用?

数仓开发手册 第 16 题 约 9 分钟读完

本文目录
  1. 先说结论
  2. 业务场景:我在某元宇宙社交应用从零搭元数据系统
  3. 段落一:资产盘点——你到底有多少张表
  4. 段落二:血缘追踪——从 SQL 里抠出血缘关系
  5. 段落三:影响分析——改动之前先看影响面
  6. 段落四:元数据系统选型对比
  7. 面试高频追问
  8. 实战踩坑:Atlas 上线三个月没人用
  9. 总结

先说结论

元数据管理的核心价值是三个『看见』:看见资产(有哪些表 / 字段 / 任务)、看见血缘(数据从哪来到哪去)、看见影响(改动会冲击谁)。

血缘不是炫酷图,是下线老表、修数据、口径追溯的救命工具。没有血缘的团队做任何改动都是赌博。

工具不重要,采集精度和业务融入最重要。Atlas / DataHub / 自研都能用,关键是能不能把采集做到字段级、能不能让业务方真的用起来。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

面试进入 45 分钟后,架构深挖的第二道题通常是元数据。面试官想看的是:你有没有用过元数据系统、懂不懂血缘 / 影响分析 / 资产盘点这些场景、有没有自己主导过元数据治理。很多候选人能说出 Atlas / DataHub / Amundsen 这几个工具名,但讲不清楚『这东西解决的是什么问题』——这题的门槛就在这里。

业务场景:我在某元宇宙社交应用从零搭元数据系统

我在某元宇宙社交应用做 Flink + Doris 实时数据平台时,早期完全没有元数据系统——谁建了哪张表只能问人,下线老表不敢动因为不知道谁在用。后来我主导接入了 Apache Atlas + 自定义 Flink Hook,一个季度把 500+ 表和 200+ 任务全部盘进去,真正做到了『改表之前能看到下游』。

Plain

元数据系统的三大能力(我当时的建设路径):
 
【Phase 1 资产盘点】(第 1 个月)
  - Hive / Doris 表元数据自动采集
  - 任务元数据(DataWorks / Flink Job)采集
  - 建立基础搜索:按表名 / 字段名 / owner 查
 
【Phase 2 血缘追踪】(第 2-3 个月)
  - SQL 解析 → 表级血缘
  - SQL 解析 → 字段级血缘
  - Flink Job → Source/Sink 血缘
 
【Phase 3 业务融入】(持续)
  - 接入 Code Review:改表前自动查下游影响
  - 接入告警:上游异常自动通知下游 owner
  - 接入下线流程:老表下线前强制看血缘

段落一:资产盘点——你到底有多少张表

没有元数据系统的团队通常说不清自己有多少资产。我在某元宇宙社交应用接手时第一次盘点扒出 543 张 Hive 表、189 个 Flink Job、2400 多个调度任务——其中 30% 过去 3 个月没被查询过、15% 的 owner 已经离职。这就是『隐性数据资产』,每一张都在耗存储和算力但没人用。

-- 资产盘点的关键查询(跑在元数据仓库上)
 
-- 查询 1: 无主资产
SELECT table_name, owner, last_modified
FROM meta_table
WHERE owner NOT IN (SELECT email FROM hr_active_employee);
 
-- 查询 2: 僵尸表(90 天没被查过)
SELECT m.table_name, m.owner, m.size_gb
FROM meta_table m
LEFT JOIN (
  SELECT DISTINCT target_table
  FROM query_log
  WHERE query_date >= DATE_SUB(CURRENT_DATE, 90)
) q ON m.table_name = q.target_table
WHERE q.target_table IS NULL
ORDER BY m.size_gb DESC;
 
-- 查询 3: 大表 Top 50(按存储排)
SELECT table_name, size_gb, owner, last_query_date
FROM meta_table
ORDER BY size_gb DESC LIMIT 50;

我的一次真实战果:那次盘点之后我们下线了 120 张僵尸表,省掉 80TB 存储;把 60 张无主表强制转移给现 owner,避免未来事故。这就是资产盘点的直接收益。

段落二:血缘追踪——从 SQL 里抠出血缘关系

血缘采集的核心是 SQL 解析。每当一个 SQL 执行时,解析它的 FROM / JOIN / INSERT INTO 子句,就能得到『输入表 → 输出表』的血缘关系。字段级血缘更进一步,追踪每个输出字段来自哪些输入字段。

Plain

-- 一条 SQL 及其血缘
 
INSERT INTO ads_gmv_daily
SELECT
  u.country,                  -- 血缘:dim_user.country
  o.dt,                       -- 血缘:fact_order.dt
  SUM(o.amount * r.rate)      -- 血缘:fact_order.amount + dim_fx_rate.rate
    AS gmv_usd
FROM fact_order o
JOIN dim_user u USING (uid)
JOIN dim_fx_rate r USING (currency)
GROUP BY u.country, o.dt;
 
表级血缘:
  ads_gmv_daily ← fact_order, dim_user, dim_fx_rate
 
字段级血缘:
  ads_gmv_daily.country ← dim_user.country
  ads_gmv_daily.dt      ← fact_order.dt
  ads_gmv_daily.gmv_usd ← fact_order.amount + dim_fx_rate.rate

为什么需要字段级:表级血缘只能回答『我改这张表影响哪些下游』,字段级能回答『我改这个字段影响哪些下游字段』——后者在 schema 变更时有云泥之别。我改一个字段不想影响到 100 张下游表,只想知道 5 个真正用到这个字段的下游表。

段落三:影响分析——改动之前先看影响面

影响分析是血缘的反向应用。血缘是『从终点追溯到起点』,影响分析是『从起点预测终点』——改一张表之前,看看会冲击哪些下游。

Plain

影响分析的典型场景:
 
1. Schema 变更影响
   - 我要改 dim_user.country 字段类型 → 看哪些下游引用了
   - 结果:37 个下游任务 / 12 个看板 / 3 个报表
 
2. 表下线影响
   - 我要下线 ods_old_log 这张老表 → 看有没有下游依赖
   - 结果:意外发现 BI 同学有个私有看板还在用
   - 避免了一次下线事故(第 14 篇讲过的坑)
 
3. 故障影响
   - fact_order 今天数据有问题 → 告诉下游哪些看板受影响
   - 自动发告警到下游 owner

段落四:元数据系统选型对比

工具优点缺点适合谁
Apache AtlasHadoop 生态成熟、自带血缘UI 古老、字段级血缘弱Hive/Hadoop 重的团队
DataHubLinkedIn 开源、现代 UI、生态丰富部署复杂、中文生态弱中大型、多引擎
AmundsenLyft 开源、搜索体验好血缘能力弱主打资产发现的小团队
OpenMetadata功能全、RESTful API 好相对年轻、社区中等新建系统的团队
自研完全贴业务、好集成研发成本高、维护重大厂数据中台

我的建议:小公司用 OpenMetadata 或 Amundsen,中等规模用 DataHub,大厂自研。不要纠结『哪个最好』——任何一个做扎实都比没有好。关键是采集精度和业务融入。

面试高频追问

追问一:字段级血缘怎么做?Union / case when 这种 SQL 怎么解析?

字段级血缘底层是 SQL AST 解析。主流方案有两条:(1)用 Apache Calcite 或 Antlr 自己写 parser;(2)用现成的 sqllineage / datahub-sqlparse 这种库。UNION 的处理规则是『每个分支的对应字段都记为血缘源』;CASE WHEN 的规则是『所有分支涉及的字段都是血缘源』。我的经验是 80% 的 SQL 用开源库能解决,剩下 20% 的复杂 SQL(动态 SQL / 宏 / 变量替换)只能靠人工标注或特殊规则。

追问二:实时任务(Flink)的血缘怎么采集?

Flink 的血缘比 SQL 复杂。两种方式:(1)Flink SQL 场景可以解析 CREATE TABLE + INSERT 语句;(2)DataStream API 只能做入口层面的血缘(Kafka Topic → Sink Table)。Flink 自带 Listener 机制(JobListener / OperatorListener),可以在作业提交时把血缘信息推送到元数据系统。我当时就是写了个 FlinkJobHook 在作业提交阶段采集 Source/Sink。

追问三:元数据系统本身怎么保证数据新鲜?

三种机制结合:(1)Hook 式实时采集——任务执行时直接推送;(2)定时扫描兜底——每天跑一次全量对账,防止 Hook 漏消息;(3)人工订正入口——允许业务方手工修正错误血缘。我们当时实时 Hook 覆盖 85% 新表血缘、夜里全扫捕捉剩余 10%、5% 靠人工修。这个比例是务实的——追求 100% 实时会过度工程。

实战踩坑:Atlas 上线三个月没人用

我第一次推元数据系统时踩过大坑——部署完 Atlas 之后光是告诉大家『我们有元数据系统了』,结果三个月下来只有两个 BI 同学偶尔用。后来反思:业务方不是不想用,是『用的成本比不用高』——他们要多登一个系统、学一个新 UI、查不到想要的字段。

解决办法是『融入式推广』:(1)在 DataWorks 编辑器里加血缘查询按钮,写 SQL 时直接能看下游;(2)企微 Bot 支持 @bot 查表,不用登 Atlas;(3)PR 模板里强制填『影响的下游资产』,迫使大家去查血缘。三个月后使用率从 5% 上升到 70%。工具本身不能创造价值,把工具嵌入现有工作流才行。

Plain

元数据系统推广的三条铁律:
 
1. 降低使用成本
   - 不新增登录、不新增 UI
   - 嵌入到大家已经在用的系统里
 
2. 提高不用成本
   - 强制 PR 填血缘
   - 下线流程强制过血缘检查
 
3. 创造独特价值
   - 告警自动下发到下游 owner
   - 故障时自动推送影响范围

总结

元数据管理这道题答好的关键是讲出『三个看见』的业务价值(资产 / 血缘 / 影响),再补一个工具选型的判断力,最后带一个真实的治理故事(盘点出僵尸表、下线避坑、推广从 5% 到 70%)。能把这几块讲到位,这题就是架构师水平。最忌讳的是『我们用的 Atlas』就结束——工具不值钱,治理思路才值钱。

下一篇:『Hive 迁 Spark SQL 你怎么做?』——引擎迁移是数仓架构题里最典型的长周期项目,考察方案设计和风险控制。

你们公司有元数据系统吗?是活的还是摆设?血缘能做到字段级吗?

关注「Wood聊大数据」| 9年大数据老兵,聊技术、聊职场、聊成长

刷题进度保存在当前浏览器