数据血缘是什么?出数据事故时你怎么用它定影响面?
考察意图
这题考的不是背「血缘=谁依赖谁」,而是候选人会不会把血缘当成事故时的影响面地图:上游找根因、下游定通报范围、字段级才能判断「这个口径改了谁会炸」。只说「我们有 DataHub」却说不清表级和字段级差在哪、过期血缘比没有更危险,这题就浅了。
回答框架
- 先定义:血缘是数据从产生到消费的依赖图,不是资产目录本身。
- 分清粒度:表级定爆炸半径;字段级才能判断口径/类型变更会不会打到下游。
- 出事按双向用:向上追来源和变换,向下列消费者、刷新窗口和该不该熔断。
- 收口生产约束:血缘要和任务调度、分区水位一起看;过期血缘比没有更误导。
参考答案(口述版)
一句话:数据血缘是「这张表/这个字段从哪来、被谁用」的依赖图。出事时它用来定影响面,不是用来写周报。
先把目录和血缘拆开。 资产目录回答「这张表是什么、口径谁负责」;血缘回答「它依赖谁、谁依赖它」。没有依赖方向,你只能猜该叫谁、该停哪条作业。
粒度决定能不能用。
- 表级:作业读了哪些表、写了哪些表。适合「上游挂了谁会空、谁会晚」。
- 字段级:这个度量经过哪些变换、被哪些报表/特征直接用。适合「改了折扣口径,GMV 和补贴率会不会一起漂」。
- 列级再往下是表达式/SQL 片段,排歧义时才下钻,日常告警先停在字段。
面试我会主动说:表级血缘够定爆炸半径,不够判断「改一列会不会炸」。口径事故必须看字段级。
出事怎么用,按双向走。 假设 ADS 的支付 GMV 今天掉了 30%:
1. 向上:GMV 字段从 DWS 哪列来,DWS 从 DWD 哪张事实来,事实从 ODS/CDC 哪条链路来。每跳看变换:过滤、去重、汇率、退款是否计入。对一下分区水位和主键行数,定位是源断了、过滤条件变了,还是汇率维没到。
2. 向下:哪些看板、周报、实验指标、特征、对账作业读这张 ADS。按刷新窗口排序:实时大盘先口头熔断,T+1 报表可以等根因;对账和资金相关先标红。
3. 定动作:能修上游就修并重跑受影响分区;修不了就降级下游(缓存昨日本数、摘看板、停依赖它的告警),不要让错误数字继续往外流。
一张「谁读谁」的查询就能把下游拉出来:
-- 表级:从产出表反查直接下游作业
SELECT downstream_job, downstream_table, edge_type
FROM lineage_edge
WHERE upstream_table = 'ads_pay_gmv_d'
AND as_of_dt = CURRENT_DATE;
-- 字段级:改了 discount_amt,看谁直接用
SELECT downstream_table, downstream_column, transform_expr
FROM lineage_column_edge
WHERE upstream_table = 'dwd_pay_txn'
AND upstream_column = 'discount_amt';
血缘从哪来。 可靠来源是「解析过的作业 SQL / Spark plan / 调度配置」,不是人肉填的 Wiki。Hive/Spark 的 INPUT/OUTPUT、Airflow 的 inlets/outlets、仓内的 information_schema 都能抽边。人肉边当补充(API、导出到 Excel 这种解析不到的),不能当主图。
口述收尾:先说「目录管定义、血缘管依赖」,再主动提字段级和过期血缘。面试官要的是你会画影响面,不是会背一个平台名字。
关键词
面试官可能的追问
追问 1:表级血缘说「这张表被 20 个作业读」,你怎么决定先通知谁、先停谁?
先按「错了代价」排序,不按下游个数。资金/对账/监管报表 > 实验主指标 > 老板大盘 > 探索性看板。再叠加刷新窗口:实时链路错一小时就是事故,T+1 可以先修再重跑。同一张表被 20 个作业读,往往只有 3 个是契约消费者,其余是临时取数;血缘边上要标 SLA 和负责人,否则你会把探索用户和资金作业一起叫醒。
追问 2:字段级血缘经常不准,还能信吗?和「这张表的负责人」比,出事时你听谁的?
字段级解析会漏:SELECT *、运行时拼 SQL、UDF、跨引擎导出。不准时把它当候选边,用「分区行数 + 主键对账 + 变换 SQL 全文」交叉验证,不要只信图上的绿点。负责人口径是定义的单一事实,血缘是依赖的单一事实;定义冲突听口径说明书和负责人,影响面听血缘再人工确认。两者打架,先按更大爆炸半径行动,再回去修边。
追问 3:没有血缘平台,临时怎么定影响面?上线一个字段变更,你最低要有什么门禁?
临时:从调度系统反查读这张表的作业名,再 grep 仓里的 SQL/报表配置;对关键 ADS 维护一张「契约消费者」名单(谁在用、刷新窗口、值班)。门禁最低三件事:变更描述写清「改了哪一列、兼容还是破坏」;CI 扫直接下游作业是否还认旧列名/旧类型;破坏性变更先加新列双跑,再切读、最后删旧列。没有字段级图,就禁止静默改名和改类型。
常见踩坑
- 把资产目录当成血缘,说得出表注释却画不出谁依赖谁
- 只有表级边就改字段口径,下游看起来「还在跑」,数字已经漂了
- 血缘是上周解析的,作业已经改 SQL,按过期图漏通知或误停
- 下游按个数平铺通知,资金作业和临时取数一起炸群,真正的契约消费者没标红
记忆锚点
目录管定义,血缘管依赖;出事向上追变换、向下定爆炸半径,字段变更必须看字段级。