数据团队里有两个问题几乎每个公司都遇到过,而且都很难靠加班解决:一个是上游要改一张表,问了三个人都没人敢说清楚会影响到下游哪些报表;另一个是同一个"日活""成交金额""库存周转",两个部门算出来两个数,各自都能拿出 SQL,都对得上线,开会时对不上账。前者是表依赖没人说得清,后者是口径没人负责。
这两个毛病看着像两件事,其实是同一件事的两个切面:前者缺的是"关系",后者缺的是"定义"。数据血缘补关系,元数据管理补定义,配套的组织流程负责让这两样东西不腐烂。这篇文章讲的是怎么从零落到能用起来,不涉及具体某一家数据治理平台的功能对比,讲的是通用办法,你在任何一家厂商的工具上、甚至纯自研都能照着做。下面几条是全文的核心判断:
这两个概念经常被放在一句话里说,但它们的形态、更新频率、失效方式完全不同,混着做会走很多弯路。
元数据回答的是"这是什么"。一张表叫什么、有哪些字段、字段类型是什么、谁创建的、什么时候创建的、属于哪个业务域、这个字段业务上的含义是什么、值是枚举还是连续、空值代表什么——这些全是元数据。它的形态是档案卡,一条记录描述一个对象,对象和对象之间没有拓扑关系。
元数据通常分成四类,这个划分不是为了概念好看,是因为它们的维护人、更新时机、使用场景都不一样,混在一起管会导致没人认领:
血缘回答的是"从哪来、到哪去"。它的形态不是档案,是一张有向图:节点是表、字段、作业、报表、API,边是它们之间的读写关系。字段级血缘把粒度压到字段,表级血缘只到表。
血缘有几种常用的读法。上游溯源是顺着箭头往回走,回答"这个报表里的数字最后追溯到哪张源表",数据出问题、怀疑上游脏了的时候用。下游影响面是顺着箭头往前走,回答"我改这张表会打到哪些东西",改表前评估风险时用——这是日常用得最多、也最救命的一种。端到端链路是两条线一起走,用来看一条完整加工链路里哪一跳最慢、哪一跳最容易失败。
这是最容易被低估的一点。很多公司做了一大本数据字典,字段注释写得清清楚楚,看起来元数据做得挺好,但真到 DBA 要下线一张表的时候,还是得在群里吼一嗓子"谁在用这张表"。
原因是:元数据告诉你这张表长什么样,血缘才告诉你这张表连着谁。注释写得再详细,也无法表达"某天某人临时写的一个 Python 脚本每晚 2 点从这张表抽数据写到了另一个库的 t_report_tmp_2021 里"。这条边不在任何人的脑子里,只存在于那条 SQL 里。缺了关系图,元数据是一堆彼此孤立的卡片。
反过来也一样,只有血缘没有语义,你能画出一张很漂亮的图,但图上每个节点到底代表什么意思,还是得靠人解释。两个都要,且它们的建设顺序有讲究——这个放到后面"三阶段路线"里说。
把锅甩给"大家不重视文档"是最省事的解释,也是最没用的解释。表依赖变乱是结构性的,因为加工链路上有五个天然绕开登记的口子。
几乎所有团队里都有一批名字带 tmp、temp、bak、20240101 的表,它们的出生通常是这样的:为了赶一次活动复盘,分析师建了一张临时表,跑完结论交了出去。三个月后,有人发现这张表数据挺全,就开始用它做周报;半年后周报变成月报进了管理层仪表盘。这张表从"临时"变成了"核心资产",但它从来没有走过建模评审,没有 Owner,没有登记。
这类问题的难点在于转正是一个渐变过程,没有明确的"转正版"时刻,所以没有自然的登记触发点。可行的办法不是禁止建临时表(禁不住),而是给所有临时库的表设一个生命周期上限:超过 N 天自动归档并通知创建者,谁要保下来,必须显式申报并指定 Owner,这一步才把它纳入正式资产清单。
调度平台里的任务能被看见,写在服务器 crontab 里的、写在个人笔记本上的、跑在某台老机器 Python 虚拟环境里的那些看不见。更麻烦的是跨语言:一个 Shell 脚本调用了 Python,Python 里又 exec 了一段 SQL,这种嵌套结构光看调度平台的任务名完全无从判断。
治理办法很土但有效:做一次全服务器扫描,把所有 crontab、所有 Ansible/Jenkins 任务、所有能找到的脚本入口过一遍,不是为了让它们全部规范(做不到),是为了知道失控面的边界在哪里。之后新任务严禁裸 crontab 上线,这一步靠发布规范卡,不靠人自觉。
数仓之外的旁路特别容易失控:应用为了省事直接连了数仓的表,BI 工具配了直连数据源,某个 ETL 任务 cross database join 到另一个业务库。这些连接在数仓侧的血缘采集范围之外——你的 SQL 解析器只解析流经数仓的语句,抓不到从应用侧发起的连接。
这一条最现实的治理手段是收口:业务侧只能读对外服务表(或视图),禁止直连明细层。要判断有没有人在直连,可以查数据库的连接审计日志、查询日志、以及执行过的 SQL 历史。这是一次性的力气活,但做过一次,心里就有底了。
视图本身是个好东西,问题是套到第三层、第四层之后,没人知道最上层的那个 select * 最终触达了哪些物理表。更复杂的是,不同数据库对视图的定义展开能力不同,有些视图里还嵌了函数、存储过程,纯 SQL 解析器到这里就抓瞎了。
应对思路是把视图层数设成硬约束——业务侧消费的最外层视图,底下最多套 N 层,超过就必须物化成物理表并接入调度。同时把视图的定义文本入库保管,让血缘解析器在遇到视图时能自动展开往下走。这个能力不是所有解析器都有,选型时要专门验。
前面四条都是技术层面的,这一条是人的层面的,但杀伤力往往最大。一个人走的时候留下一份交接文档,文档里写了他记得的内容;他不记得的那些——半年前写的那个修数脚本、某个表为什么在那个时间点要用这种奇怪的 join——全跟着走了。接手的人只能靠猜,猜错的地方就成了隐性债务。
能缓解的办法只有一个:让知识沉淀在系统和流程里,而不是沉淀在人的脑子里。这不是唱高调,具体到动作就是:所有上线走评审并留痕、所有表必须有 Owner 字段且 Owner 离职时自动触发认领、所有非标准加工必须登记。人走留不下上下文,是因为上下文从来没有落到能被人接手的地方。
"同一个指标两个部门算出两个数",绝大多数情况下不是谁算错了,而是两个人对同一句话的理解本来就不一样。把分歧点拆开看,主要来自五种来源。
下表把五种来源的典型表现、成因、排查难度和根治办法放在一起。排查难度一栏指的是业务同事自己发现差异到定位到具体那一行 SQL 的耗时感受,不是任何系统实测数据。
| 来源类型 | 典型表现 | 为什么会这样发生 | 排查难点在哪 | 根治办法 |
|---|---|---|---|---|
| 同名不同义 | 都叫"活跃用户",A 部门按当日有登录行为计,B 部门按近 7 日内有任意行为计,数必然不同 | 指标名没有唯一所有者,谁都可以叫同一个名字;历史 SQL 被复制后改了一行还沿用原名 | 两边都说自己是对的,差异藏在一行 where 条件里,肉眼不比对 SQL 发现不了 | 指标名全局唯一并注册进字典;同名只有一个受管理的定义,其余分支必须换名 |
| 同义不同名 | "成交金额""支付金额""GMV 口径销售额"指同一件事,各自演化出独立的加工链路 | 没有统一的业务术语表;新同学不知道已有同义指标,按自己的理解新建 | 三条链路各自演化,问题发现时差异已经沉淀了几个月的口径分叉 | 建业务术语表做别名归一;同义关联在字典里显式标注,任选一条作为唯一受管理出口 |
| 时间口径与时区差异 | 一方按下单时间归日,一方按支付时间归日;数据库存 UTC,导出时按东八区换算,跨零点订单被分到两天 | 业务上"今天发生"的定义没有统一;事件时间与处理时间混用;时间字段本身的时区没写进注释 | 日粒度看不出来,拉长到周/月又会因为归日规则两边倒,逐日对账才发现系统性偏移 | 字典里强制写归日字段与时区;UTC 入库、展示层换算的规则写死并纳入评审 |
| 过滤条件口径差异 | 一方剔除内部测试账号与压测订单,一方没剔;一方扣了退款单,一方只算了正向流水;是否去重、按什么去重各不相同 | 过滤条件逐步叠加在历史 SQL 上,每一版加一行,没人系统整理过"这个指标到底排除了什么" | 过滤条件不在 select 里,看结果列发现不了;要读到 where 才知道差在哪 | 字典里"过滤条件"必须是逐条列举的完整清单,不接受"按惯例剔除"这类模糊表述 |
| 加工层级与数据源差异 | 一方读明细层,一方读已加工的汇总层,两边源头的补数频率与回溯范围不同 | 汇总表当初是为了性能建的,后来被当成数据源用,但没同步登记成受管理资产 | 差异随上游刷新呈阶段性波动,时差烦一段时间自动消失,容易被当成偶发问题放过 | 受管理指标锁定唯一加工出口,其余路径标记为派生;汇总层的边界写清楚允许被谁消费 |
把这五种来源放在一起看,会发现一个共同点:它们都是"定义缺失",不是"计算错误"。所以解法也不在计算环节,在登记环节。谁拥有这个名词的所有权,谁就负责写清楚它排除了什么、按什么时间归、用哪个源——写清楚了,两个数就变成一个。
很多数据治理项目死在同一个地方:先花了两三个月选型、部署、培训,上线那天发现系统里是空的,因为从来没有人往里面填东西。工具解决的是"存得下、查得快、看得清",它解决不了"本来就没登记"。
第一步是从元数据里拉出全量表清单,然后做一次减法。全公司有几千张表是正常的,把其中"没人敢动、动了大半个公司要出事"的核心资产挑出来,通常只有几十到一两百张。这几十张就是第一阶段要管住的全部范围。
划核心资产有三个可用的判据:被多少个下游对象直接引用(如果暂时没有血缘,就用"被多少 SQL 提到过"近似)、是否在某个对外报表或对外 API 的链路里、是否包含不可再生的原始数据。三个里占两个,就进核心清单。剩下的表,第一阶段直接不管。
这一步的价值在于把治理范围从"几千张"缩到"几十张"。范围失控是治理项目失败最常见的原因——承诺要管所有东西,结果什么都管不深。
Owner 是自然人或明确的最小团队,不接受"数据组""BI 团队"这种集体署名。集体署名等于没有 Owner,出现争议时谁也说不清该谁拍板。
Owner 的责任边界要写死:他对该对象的定义负责,不一定要对该对象的加工负责。也就是说,加工链路可以是别人写的,但"这个字段到底算什么",Owner 说了算。这个区分很重要,否则没人愿意认领——大家怕的是揽下所有技术债。
配套要有一条:Owner 离职或转岗时,自动触发重新认领流程,未认领的资产进入"孤儿资产"名单并在周会上曝光。这条动作比写一百页规范有用。
把"要登记"变成"在某个动作发生前必须登记",也就是把登记嵌入流程:新表上线前必须有 Owner 与业务归属,否则建表审核不通过;CI/CD 发布前自动比对,涉及已登记资产的变更要 Owner 确认;表下线前必须走公告期。
这三个卡点覆盖了资产的生、变、灭三个关键时刻,也是登记数据最容易腐烂的三个时刻。剩下的日常维护就不多了——如果日常还要大量手工更新,说明卡点设计得不对。
采集血缘没有银弹,业界的通用做法是四种方式叠加使用,因为它们覆盖的范围和失真的地方各不相同。理解失真点比理解覆盖率更重要——你不会想知道一条血缘失踪的时候。
把作业里的 SQL 文本拿出来做语法解析,抽取出输入表/字段与输出表/字段的映射关系。这是主流开源方案采用的技术路径,覆盖广、成本低、可以离线批量处理历史作业,而且天然支持字段级粒度——这一点其他几种方式很难做到。
它的失真点很明确:只能解析它拿得到、且能看懂的那部分 SQL。具体来说,以下几种情况会漏或错:作业里的 SQL 是代码拼接出来的(Python f-string、MyBatis 动态 SQL),解析拿到的是模板而非实际语句;SQL 里调用了存储过程或 UDF,函数内部的读写关系在解析视角里是一团黑盒;跨引擎的多段逻辑(先读 MySQL 写到临时文件,再 load 进数仓),中间那一段在 SQL 文本里不存在;视图未展开时,解析会停在视图名上,看不到底下的物理表。
还有一个容易忽略的:解析出来的边是"曾经可能发生过"的关系,不代表实际执行了。一段 if 分支里的 SQL,条件没触发也可能被解析为一条边,这会导致影响面被高估。
在调度平台侧采集任务与任务之间的依赖关系,以及任务输入输出的配置项。优点是准确度高——这是系统真实编排的依赖,不是猜出来的;缺点是粒度粗,通常只能到任务级或表级,且完全依赖调度平台的元数据开放程度。
另一个失真点:任务内部真正读写了哪些表,调度侧并不知道。一个任务配置里声明了读三张表,实际 SQL 里读了七张,这七张里另外四张就漏了。所以调度埋点适合用来补关系的"骨架",不能当完整的血缘。
从数据库审计日志、查询日志、甚至网络抓包里反推"谁读了谁"。优点是它反映的是真实发生过的行为,包括那些藏在笔记本里的脚本、BI 工具的直连、应用的旁路查询。前面提到的辞职邮件那种场景,只有这一种方式能兜住。
代价也不小:日志量极大,处理成本高;日志通常有保留期限,过期就没了;从日志里解析出结构化的读写关系需要处理 FROM 子句改写、视图展开、临时表名还原等一堆麻烦;而且它只能告诉你发生过,不能告诉你将来会不会发生——某张表一个月才被查一次,你可能刚好在两次之间做了判断。这种方式通常用来做验证和补漏,不做主干。
最不受待见,但某些地方不可替代。跨系统的、非 SQL 的数据搬运(ETL 工具里的拖拽节点、SaaS 之间的同步、人工导出 Excel 再导入)穿不透自动采集,只能由人来登记这条边。
要让人工登记不成为负担,关键是把登记做成一个极轻的动作:一条边只需要填上游、下游、说明三个字段,且登记入口就在日常使用的工具旁边(比如 BI 工具的表详情页里放一个"补充说明上游"按钮)。指望让人填一张复杂表单,登记率一定是零。
四种方式的实际覆盖率没法给通用数字,取决于你的技术栈整洁程度。务实的做法是:SQL 解析打底,调度埋点补骨架,日志定期抽样验证并兜底异常,人工登记兜住非 SQL 链路。并且要接受一件事——血缘永远是"尽可能准确",不可能百分百完备,所以任何"基于血缘自动阻断"的决策都要留人工兜底。
对血缘抱有过高期待,是它最后被弃用的主要原因。把边界说清楚,反而更容易用起来。
第一类:影响面。"我改这张表的这个字段,下游有谁会受影响?"这是改表、下线表、重跑数据之前必问的问题,也是最有体感的价值。有了表级血缘,这个问题从"在群里吼一嗓子"变成查一次。
第二类:溯源。"这个报表底座的这个数字,一直追溯到最初的源表,经过了哪些加工?"数据异常时用来定位哪一跳出了问题,除此之外还用于判断"这个数能不能对外报"。
第三类:链路结构。"哪些是我链路上的单点?哪些表扇出特别大?哪些作业跑失败了会连锁炸一片?"这一类属于健康度评估,用来排优化优先级:扇出大的表要多给一倍关注度,它就是事实上的核心资产。
语义问题。血缘能告诉你 order_amount 这个字段从支付表流到了报表,但它不知道这个字段到底是含运费还是不含运费、税前还是税后、退款了要不要扣。语义只能靠业务元数据和指标字典,这两件事血缘帮不上忙,只能提供"去哪里问"的线索(顺着边找到 Owner)。
质量问题。血缘描述的是"数据怎么流动",不是"数据对不对"。空值率突增、枚举值域漂移、行数异常、分布偏移,这些是数据质量监控的范畴,需要独立的规则引擎和基线。血缘在这里的作用是辅助定位——质量告警触发之后,沿着血缘往上游走去找根因。
权限问题。血缘图本身往往会让原本分散的权限信息集中呈现,这属于需要谨慎处理的部分:能看到全链路的人,理论上就掌握了全公司的表关系图。血缘系统的权限要单独设计,不能默认对所有分析师开放全图查询。
指标字典是最容易做成"写了没人看"的东西。根本原因通常不是平台不好用,而是条目本身不完整——内容缺一半的时候,业务同学查了还得再问人,那下次就不查了。
字典的入口要在人正在工作的地方。在 BI 工具的表详情页、在 SQL 编辑器的侧边栏、在报表的指标名旁边放一个跳转链接,而不是让业务同事先打开另一个系统再搜索。多一步跳转,使用率减半,这不是夸张的说法。
字典要有"只剩下这一个出口"的强制力。受管理指标在 BI 层的语义模型里只暴露一个受管字段,历史 SQL 里那些同名不同义的写法随着 BI 层收敛逐步退役。只要还有多个入口并存,字典就是参考读物而不是标准。
缺失条目要能被看见。定期扫描所有对外报表用了哪些指标,反查字典里有没有登记,把缺失率做成一张能被人看到的表,挂在数据部门自己的周会上。内部指标比外部承诺更容易推动。
所有数据治理项目最终都死在同一个地方——上线时是新的,半年后是旧的。对抗熵增只能靠流程把维护动作固化下来,下面四个复选框是投入产出比最高的。
新增核心表、新增或修改核心指标之前,走一次短评审,评审的唯一产出是"这张表有 Owner 了、定义写清楚了、命名没撞车"。评审要短,超过 30 分钟就没人愿意来了;它的意义不在审查技术方案,在于创造一个必须登记的时刻。
业务口径改变是正当的且经常发生的,怕的不是改,是改了没人知道。规则很简单:受管理指标的口径变更,必须有变更记录、必须有生效时间点、必须通知已知下游。通知的方式可以是自动的——血缘里查出下游 Open Owners,系统自动发一条变更提醒。
最关键的一条约定:口径变了,要不要重算历史数据。不重算就会出现"同一个看板上半年和下半年的口径不一样",这种数据解释成本极高。无论选哪个,都要在变更记录里写清楚。我的倾向是核心财务类指标必须重算,探索类指标标注断点即可。
没人用的表不敢删,是因为不知道有没有人在用。有了血缘,"确认无人引用"这件事可以自动化:查下游计数为零、且过去 N 天内没有查询记录,才进入下线流程。下线流程本身要留一个公告期:先在显著位置标记该表的下线计划与时间点,公告期结束后再真正删除。
公告期的存在不是为了兜底线,而是为了给"用得很少但很关键"的那类场景留出反应时间——月度报表、季度审计、年报导出,这些可能是几个月才跑一次的。
这是让血缘保持新鲜的自动化手段:变更发布前,自动比对这次涉及的对象有没有在下线公告期里、有没有 Owner 未确认的变更、有没有触碰标记为核心资产的表。命中规则就阻断或要求二次确认。
规则要少而准。一上来配二十条规则,很快会被人想办法绕过;从"触碰核心表必须 Owner 确认"这一条开始,效果最好。
一次性铺开的方案基本都失败了。下面这条路线的前提是你承认自己的资源有限,愿意用半年到一年的时间慢慢把地基打实。
范围锁定为核心资产清单那几十张表,只做表级血缘,只做一个功能:输入表名,输出下游列表。这个阶段不要做可视化大图,不要做字段级,不要做告警。
衡量这个阶段是否成功的标准非常朴素:DBA 改表之前,会不会主动去查一下。如果答案是不会,说明结果与大家的实际认知偏差太大(通常意味着解析覆盖率不够或者失真严重),先把准确度补上去,别急着加功能。
血缘提供了"关系",第二阶段补"定义"。范围同样克制:只给对外报表、对外 API、管理层看板里实际在用的指标建字典,通常几十个。
这一阶段的产出要能被业务同学直接消费:在 BI 层的语义模型里把受管理指标固化成唯一出口,让"查字典"变成随手可得的动作。做完这一步,前两个业务痛点(改表怕炸、两个部门两个数)在主要面上就有解了。
血缘大图、字段级血缘、链路健康度评分、异常自动告警,这些都属于有了前两个阶段的基础之后才有意义的东西。没有准确的边,画出来的大图只是一张好看的错误图;没有清晰的 Owner,告警发出来也不知道发给谁。
这一阶段还要补上三件事:针对数据质量的基线监控、把血缘接进发布检查、以及对非 SQL 链路做人工登记兜底。这三件的共同点是都依赖前两个阶段攒下的准确边与清晰 Owner——没有 Owner,质量告警发出去也不知道该发给谁;没有准确的边,所谓的自动告警只会把噪音放大成新的负担。
血缘和元数据系统的部署位置是个常被忽略的话题。它本身也是一套有资源画像的服务,放得随意会出问题。
一套典型的元数据/血缘系统由三块组成:元数据存储(关系库或图/文档库)、采集器(定时解析 SQL、拉取调度元数据)、Web 服务(查询与展示)。
这三块的负载特征差别不小。采集器是批量的 CPU 密集任务,通常压在夜间窗口;Web 服务是低频但延迟敏感的交互式查询,突发性强;元数据存储则是典型的随机读写负载——图遍历类查询尤其如此,一次"查三跳下游"的请求会带来大量随机读。
这就是为什么元数据服务的存储不能放在随机读写能力弱的介质上。SSD 介质的随机 IOPS 比机械盘高出一到两个数量级,这一差距在多跳图查询上体现得特别明显。以一万网络官网公开的存储规格为例,其纯 SSD 架构(Sas3 SSD)标称随机读写 50000 IOPS、吞吐 800Mb/s(官网明示参数,以官网实时规格为准)——这一类指标正是判断"能不能扛住图遍历"的关键参数。选型时与其盯着容量,不如先把随机读写性能和实际查询链路上的缓存命中率摸清楚——同样的 SSD 介质,缓存没命中时的表现和理想值之间往往隔着很大一段距离。
元数据服务不建议和业务数据库共用实例,有两条硬理由。一是资源争抢:夜间批量采集跑起来时,采集器的 CPU 与磁盘占用会拖慢同机宿主上的其他服务,而 Web 端恰好是白天有人用才慢,两边时段不同更容易掩盖问题。二是故障隔离:元数据服务挂了影响的是"查不到",业务库被拖垮影响的是"用不了",这两件事的严重程度不是一个量级。
从可用性角度,元数据库还应该是整个链路里最先被保护的那一个——它记录了所有资产的位置和关系,它自己丢了,恢复其他东西就没有地图。
元数据本身的数据量通常不大(相比业务数据),这给了备份很大的操作空间:高频全量 + 异地留存是划算的。要特别注意的是元数据的"可解释性"——如果恢复出来的元数据辖属关系已经和现实脱节,它的价值会急剧下降,因此恢复演练要和业务数据的演练同等对待。
跑元数据的云服务器,选型上可以参考一万网络官网明示的几档起步配置:云服务器 ¥55 起、一万云 ¥25 起、云数据库 ¥1 起、对象存储 OSS ¥99 起、负载均衡 ¥26 起(均为官网明示起步价,以官网实时价为准)。这里的起步价对应入门机型,实际承载图库和 Web 服务需要按 CPU、内存与磁盘规格单独核算。如果需要把元数据库独立部署在物理资源上(很多团队会这么做以避免虚拟化层的抖动),那一侧的定价通常不在起步价覆盖范围内,实际配置与价格以咨询为准。
服务响应这条也要算进选型:元数据查询卡住的时候,往往是业务侧正在等结论。一万网络官网明示的服务基线是 7×24 中文工单、平均 5 分钟响应,硬件故障 10 分钟自动迁移,自营机柜最快 1 分钟上架(均为官网明示项,不做超出此范围的承诺)。对这类支撑系统而言,"出问题后多久有人接手"是比峰值性能更现实的考量——这家服务商深耕 IDC 19 年(成立于 2007 年),华南、华东、华北、华西以及香港与海外多个节点都有官网明示的在售线路,扩容和跨节点部署时的选择面比较明确。
为什么坑:工具的定位是承载已经存在的元数据,它不能凭空生成。部署完发现系统里是空的,团队要临时组织一批人补录,补录过程枯燥且无人认领,几个月后项目就无声无息了。更糟的是买了工具之后心态会变——钱花了,就必须证明有价值,于是被迫追求"看起来内容很丰富",反而堆出一堆没人负责的低质量条目。
怎么避:把顺序倒过来。先用一到两周把资产清单和核心范围划出来,把 Owner 全部认领到人,然后再选型。这时候你甚至会发现,在 Excel 里维护几十个核心指标字典也能解决 80% 的问题,工具要不要买反而不急。
为什么坑:字段级血缘的采集难度、解析失座率和存储量都比表级高一个量级,而且字段级的边数量会爆炸——一张宽表两百个字段,两两之间的映射关系可能上千条。在第一阶段追求它,结果是准确度上不去、查询又慢,两头不讨好。
怎么避:表级打底,并且先保证表级的准确度能被业务侧认可。字段级只在必要的地方做——比如涉及敏感字段(个人隐私、财务科目)的合规溯源场景,把范围收窄到几十个关键字段,准确度才能保证。
为什么坑:前面说过,血缘本质是"尽可能准确"。如果拿它做自动化的强阻断——比如命中核心自动审批、自动下线、自动告警噪声——一旦某条边漏采,就会出现"系统说没人用,实际有人用"的事故,而且这类事故很难复现。
怎么避:让血缘做提示,不要做判决。自动阻断的规则只保留最保守的一两条,其余都做成"需人工二次确认"。同时把血缘的覆盖率做成可见指标,让大家知道它的可信边界在哪。
为什么坑:"数据组""BI 中心"这样的集体署名,在实际发生口径争议时没有任何人需要负责。最后的结果是争议照旧,只是多了一个需要维护却毫无作用的字段。部门做 Owner 还有一个隐蔽代价:部门内部换人时,上下文同样会丢。
怎么避:硬性要求 Owner 字段填到自然人,最多允许多人但必须指定第一责任人。如果确实找不到人,就明确标记为孤儿资产并单独跟进——把孤儿显性化,比假装有人负责要健康。
为什么坑:这是"字典写了但没人用"的头号原因。业务定义写得再漂亮,没有过滤条件清单,业务同学对账的时候还是得去翻 SQL,翻 SQL 比翻字典还快,那字典就永远不会被打开。
怎么避:把"过滤条件清单"作为字典条目的必填校验项,缺了不允许发布。条目发布前的第一版最好就是由写这条 SQL 的人直接填,而不是让治理专员事后补——只有写 SQL 的人知道当初为什么加那行 where。
值得,而且人少的时候做最划算。判断标准不是团队规模,是"改一张表之前,你需要多久才能确认影响面"。如果答案是"喊一嗓子问一圈,还得碰运气",那成本已经很高了。人少的好处是范围可以极小:把常被频繁修改、且下游最集中的那十几张表挑出来,用 SQL 解析拉一遍,做成一个能查询的清单,两个人花两周就够了。规模小的时候千万不要照搬大厂那套完整治理框架,那套东西的前提是有专人做治理运营。先把"改表前查一次影响面"这件事变成习惯,其余的以后再说。
最该看的是它对你们真实技术栈的解析能力,而不是它官网功能列表有多长。具体做三件事:拿你们实际在跑的、最复杂的二十段 SQL(尤其是带动态拼接、存储过程、多层视图的那些)去试,看能解析出多少边、有多少错;看它对你们调度平台的接入深度,是只能读任务名还是能读到输入输出配置;看它的元数据模型能不能扩展,你们自定义的标签、Owner、安全等级能不能加字段。功能列表拉得很长但解析不了你们的实际 SQL,等于零。另外注意它的社区活跃度和版本迭代频率,解析器的维护是长期的脏活,跟着方言版本升级,停更的项目两年后就失效了。
取决于你们的变更频率,通用做法是增量与定时相结合:作业变更上线时触发即时重解析(这是最准的时刻,因为代码刚提交),之外每天做一次全量校验兜底,捕获那些绕过了发布流程的变更。单纯依赖每日全量会有最多 24 小时的滞后,这期间有人改了表,血缘就是旧的,而恰恰这个时候最需要它。单纯依赖事件触发则会漏掉所有非标准发布路径。两者叠加的成本并不高,因为全量校验可以放在夜间低峰。另外要监控解析失败率——解析失败的任务往往就是那些用了奇技淫巧的作业,它们恰恰是血缘最需要覆盖的部分。
不要把它当成"要业务配合填表"来推动,要把它变成某项工作的副产品。有效的做法是在需求评审那一刻就要求产出口径:业务方提"我要看月度复购率",评审的产出物里必须包含这个词的业务定义和排除规则,写不出来说明需求本身还不清楚。这样业务定义是在讨论过程中自然产生的,而不是事后被行政要求补的。另一个办法是让数据同学先写草稿,让业务同学改成正确版本——改别人的比凭空写容易得多。行政手段兜底的方式是:没有业务定义的指标不允许进入 BI 的受管理层,也就是不能出现在正式看板上,这一条比开会强调有效。
不要试图一次性补全历史债,那是典型的烂尾项目。做法是增量从严、存量渐进:所有新增资产必须完整登记(这一步靠流程卡,成本可控);存量资产按照"被引用热度"排序,只给 TOP N 补登记,剩下的标记为低优先级并在查询时给出提示。还有一个更聪明的办法:借事修路。哪张表因为没 Owner 出过一次事故,就顺势把那张表及其上下游补登记 —— 事故是最好的登记触发点,因为利益相关方的抵触最小。用半年时间,你会发现真正高频的核心资产已经覆盖得差不多了,剩下的长尾确实不值得投入。
会,而且这是常见的浪费来源。合理的分工是:指标字典负责定义与审批流程,BI 语义层负责执行与消费,两者之间通过唯一英文名关联,不各写各的。也就是定义只在一处(字典),语义层里的同名指标必须从字典同步过来,改口径时必须先在字典里走变更评审,再同步到语义层。如果两边各有一份口径说明,半年后必然不一致,那时候业务同学就不知道信谁。实现上不一定要做双向同步那么复杂,最低要求是:语义层里的每条指标标注它对应的字典条目,且字典变更时有一条必做的同步动作。这条动作要写进发布清单,不能靠人记。
要,而且建议作为第一批 Governance 对象。理由很实际:如果它自己的资产清单没被登记、备份策略没写清、Owner 没指定,那它出问题时你会发现连恢复要找谁都不知道。另外一个容易被忽略的点是它的自身数据也需要血缘——至少要知道元数据库里的哪几张表是源头表、哪部分是派生出来的,否则某天有人误删了一层,你连能重算哪部分都判断不了。这件事工作量很小,通常就是几张核心表的登记,但收益是在最需要的时候有一张准确的地图。顺带提醒:元数据服务的备份恢复演练要和数据层面的演练同频,恢复出来的元数据如果和现实脱节,其价值会急剧缩水。
回到开头的两个毛病,它们的解法其实是同一句话:把"原本只存在于某个人脑子里的东西",挪到一个所有人都查得到、且在关键流程上会被强制更新的地方。表依赖说得清,靠的是把边的采集接进作业发布;指标口径不再打架,靠的是给每个名词找一个唯一的所有者并让他对定义负责。工具在这两件事里的角色是容器和外围提醒,不是主角。
如果你的资源只够做一件事,那件事应该是给核心资产认领 Owner 并维护影响面查询,而不是买一个功能很全的平台。Owner 是定义的所有权,影响面是关系的可见性,这两样齐了,剩下的可以慢慢补;反过来,平台再漂亮,没人认领、没人更新,三个月后就是一份装饰品。
Copyright © 2013-2020 idc10000.net. All Rights Reserved. 一万网络 科技有限公司 版权所有 深圳市科技有限公司 粤ICP备07026347号
本网站的域名注册业务代理北京新网数码信息技术有限公司的产品