ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

数据资产管理实战:元数据与血缘构建数据账本

数据资产管理实战:元数据与血缘构建数据账本

2. 数据资产盘点:把账本立起来的关键第一步

数据中台这个概念火了好几年,建设思路也从“先把数据都搬到一起”慢慢演变成“先想清楚到底有什么数据、数据是什么、怎么被使用”。我去年参与一个客户的平台改造时,他们的数仓里躺着几千张表、几百个接口任务,业务部门报数还要靠“问一个人”,那个人走了之后口径直接断档。这种场景你一定不陌生——问题不在于数据少,而在于数据资产本身没有台账,元数据没有沉淀,血缘没有记录,资产就是一笔糊涂账。

这篇文章围绕的就是数据资产管理里最核心的两个抓手:元数据管理和数据血缘。前者解决“数据是什么”的问题,后者解决“数据从哪里来、到哪里去”的问题。适合正在做数据中台、数据治理的数据平台工程师、数据产品经理和数据团队负责人,尤其适合刚把数仓搭起来、准备补治理课的同学。

2.1 数据资产盘点到底盘什么

很多人一提到数据资产盘点,第一反应就是“把库表清单导出来”。这远远不够。真正的资产盘点要覆盖三个层面:存储资产、计算资产和服务资产。

存储资产就是物理表、字段、分区、文件,属于技术元数据的范畴。计算资产是那些产出数据的任务,包括ETL脚本、存储过程、实时计算作业,它们决定了数据是怎么被加工的。服务资产是向外提供的API、报表、指标服务,业务方直接感知的就是这一层。三层的台账全部起来,你才能回答“某个指标对应哪些底层表、中间经历了几层加工、最终被哪些报表使用”这种完整链路的问题。

我之前参与过一个模拟项目X,盘点阶段把中间层的表任务全部梳理了一遍,发现将近一半的表在近90天内没有任何下游消费,属于“僵尸表”。清理掉这些冗余加工之后,整体任务调度时间缩短了将近20%。这就是盘点的直接价值——不光是“知道有什么”,更重要的是识别哪些资产是真正在创造价值的,哪些只是在消耗存储和计算资源。

2.1.1 元数据的分层模型与核心价值

元数据是“描述数据的数据”,简单说就是数据的说明书。我在实际项目里习惯把元数据分成三类:

元数据类型核心内容典型来源运维侧重点
技术元数据库表结构、字段类型、分区信息、血缘、任务依赖数据源驱动、调度系统、SQL解析采集、同步、一致性
业务元数据指标口径、维度定义、数据标准、标签语义业务部门、数据产品经理维护、评审、发布
管理元数据责任人、权限、数据分级、生命周期数据治理平台、审批流程权责、审批、合规

三类元数据里,技术元数据是地基,业务元数据直接决定业务方能不能“看懂数、用好数”,管理元数据则解决“谁负责、谁能用”的问题。三者缺一个,资产目录用起来都会变扭。比如只有技术元数据没有业务口径,业务方看到“销售额”字段完全不知道统计口径是含税还是不含税,那这个资产目录就沦为了给技术看的一张表结构清单。

元数据的核心价值我用一句话概括:让使用者找得到数、看得懂数、信得过数、用得对数。找得到靠检索和分类,看得懂靠业务描述和样例,信得过靠血缘和质量信息,用得对靠口径和权限约束。

2.2 元数据管理的落地实现:从采集到服务化

很多团队在元数据管理上最容易犯的毛病,是把系统建成了“数据仓库里的一个元数据库”,采集完任务就算结束。真实的情况是,元数据管理要做成一条流水线:采集、加工、服务,每一个环节都必须打通,才能支撑上层的资产目录和数据地图。

2.2.1 技术元数据采集链路设计

先说采集,这是元数据管理里最底层也最容易被低估的环节。从实际经验来看,采集方案的选择要取决于数据源的开放程度和平台管控边界,没有一套方案能包打天下。

我通常把采集方式分成三种,按实际项目情况组合使用:

  • 事件告知型:数据源每次发生结构变更,通过消息或回调主动推给元数据系统。实时性最好,但对数据源侧的改造要求高,适合自研平台或能推动改造的场景。
  • 轮询拉取型:元数据系统定期调用数据源的Schema查询接口,对比现有信息后增量更新。实现最简单,兼容几乎所有数据源,缺点是实时性差,一般频率设置在分钟级到小时级。
  • 日志解析型:通过分析数据源的审计日志、SQL日志来发现结构变更和数据访问行为。适合做数据地图里的“数据热度”分析,但采集链路复杂,准确率依赖日志质量。

我分享一个实操细节:挂载在采集任务上的调度频率,一定要和表的更新频率匹配,不然会出现两种尴尬情况。一种是采集太快,元数据里全是中间态,血缘和结构信息频繁抖动,下游依赖分析完全不靠谱;另一种是采集太慢,表结构变了半天没发现,上层数据服务已经在报错下游字段不存在了,元数据却还蒙在鼓里。业内比较通用的做法是分层设置频率,ODS层表结构变更频繁,一般小时级采集;DWS和ADS层相对稳定,每天采集一次就够;维度表和配置表变更极少,甚至可以按周采集。

2.2.2 业务元数据建设与运营机制

业务元数据是很多平台做不起来的分水岭。技术元数据可以靠采集自动化解决,业务元数据天然需要人参与,而且是跨部门协作。我之前在某公司内部推指标口径字典,最大的阻力不是系统功能不够,而是没人愿意花时间去维护“一个看不到短期回报的文档”。

破局的办法是把业务元数据的管理嵌入到日常流程里,而不是做成一套额外的义务劳动。具体来说有三条路:

  • 指标申请流程自带口径填报:业务方要申请新指标,必须填写指标定义、计算公式、统计粒度、更新频率这几个必填项,审批通过后自动生成指标卡片。这样新指标一出生就带着“说明书”。
  • 已有资产通过“认领”机制补齐:资产目录里未认领的资产,定期推送给疑似负责人,认领时顺便补充业务描述和口径。这个操作短期看是在补旧账,长期看是把责任落实到人。
  • 变更流程强制回流:任何指标口径的修改,必须走变更申请,系统自动记录历史版本,保证“换口径留痕”。我见过太多团队改完口径不通知下游,最后数据对不上又来排查的情况,这个机制能直接避免这类事故。

业务元数据的另外一个重要来源,是数据标准。有数据标准的字段,业务元数据可以直接继承标准定义。比如“客户编号”这个字段,标准定义了格式、编码规则、是否唯一,那么所有表中叫customer_id的字段都可以自动挂上这条标准。这里有一个细节要注意:字段名一样不代表含义一定一样,所以继承逻辑里一定要做“字段名+所在表所属主题域”双重匹配,不能只按字段名字符串匹配,不然很容易把不同语义的同名字段当成同一个标准来管理。

2.2.3 元数据服务化能力建设

元数据采集完之后如果只是躺在库里,价值就打了一半折扣。真正的元数据平台要做的是把元数据“服务化”,向其他系统输出能力。

最基础的是统一检索能力,也就是常说的数据地图。业务方输入“客户”、“订单”、“销售额”等关键词,就能搜出相关的表、指标、API,并且直接看到表的数据量、更新时间、负责人、关联的血缘图。我参与的项目里,数据地图上线之后,新同学找数的效率提升非常明显,原来问东问西半天的活儿,地图上点几下就能定好要用哪张表。

其次是元数据API化。数据质量系统要查某个字段的质量规则覆盖率,数据开发平台要在表结构变更前做影响分析,数据服务网关要在API发布时校验字段口径——这些全都通过API从元数据服务里拿数据,而不是各系统自己维护一份元数据副本。这个点特别重要,元数据一旦分散维护,必然出现口径不一致,最后不知道信谁的。

服务化还有一个场景容易被忽略:数据权限申请。我在一个客户那里看到他们把元数据里的数据分级和权限申请打通,敏感字段在资产目录里直接标识,申请权限时系统自动提示需要额外审批。这个打通看起来简单,但确实能省掉大量沟通成本。

3. 数据血缘:把数据的来龙去脉织成一张网

元数据解决的是“数据是什么”,数据血缘解决的是“数据从哪里来、加工过程中经过哪些节点、最终被谁使用”。没有血缘,数据资产就是一张张孤立的表,有了血缘,资产之间才形成一张可追溯的关系网络。

3.1 血缘的粒度:表级、字段级到表达式级

血缘的粒度直接决定它能支撑什么场景。我对血缘粒度的分类是这样的:

血缘粒度表达内容典型应用
表级血缘表A加工出表B影响分析、上游表依赖
字段级血缘表A的字段a1加工出表B的字段b1字段影响面、口径溯源
表达式级血缘b1 = sum(a1) + avg(a2),记录加工逻辑口径透明、指标解释

表级血缘是基础,绝大多数数据平台都能做到,采集方法就是解析调度系统的任务依赖,或者解析SQL里的insert/select目标表关系。但表级血缘粒度太粗,它只能告诉你“B表依赖A表”,回答不了“B表的c字段到底是从A表的哪个字段算过来的”这个问题。在实际业务里,这个问题的价值远大于表级关系。

字段级血缘的构建就要复杂得多,它需要精确到SQL的select列表里每个字段的来源。比如类似这样的SQL片段:

INSERT INTO dws_customer_analysis SELECT customer_id, SUM(order_amount) AS total_amount, COUNT(DISTINCT order_date) AS active_days FROM dwd_order_detail WHERE order_status = 'valid' GROUP BY customer_id;

解析器需要识别出目标表dws_customer_analysis的total_amount字段,来源于dwd_order_detail的order_amount字段经过SUM聚合后得到,active_days来源于order_date字段经过COUNT(DISTINCT)后得到。这个分析结果要被记录成字段级血缘关系。表达式级血缘更进一步,连“SUM(...)”这个计算逻辑本身也会沉淀下来,用于指标口径的解释和校验。

我在实际项目中得到的体会是,先做表级血缘快速见效,再逐步向字段级和表达式级演进。一上来就要求全链路字段级血缘,技术上的坑会把你拖垮,业务上也未必所有场景都需要那么细的粒度。

3.1.1 SQL血缘解析的技术实现方式

业界主流的血缘解析路径有这么几条:

  • 基于开源SQL解析器二次开发:比如Java生态里的JSQLParser、Spark生态里的Catalyst。这些工具能把SQL解析成语法树,血缘解析就是遍历语法树提取字段流转关系。优点是省力,缺点是对复杂语法、方言的支持有限,特别是某系数据库的存储过程,解析成功率会比较低。
  • 基于数据源执行计划:以数据源真实的执行计划或者逻辑计划来分析血缘,比纯静态解析更准确,因为数据源本身最懂自己的方言和语法。缺点是侵入性比较强,通常需要和引擎团队协作才能落地。
  • 自研解析引擎:适合SQL方言非常复杂、对准确性要求极高的场景。投入大、周期长,一般团队不建议走这条路,除非你正在自研数据开发平台。

我用Spark引擎的项目里做过一个对比实验:同样一批生产SQL,基于Spark Catalyst解析达到的字段级血缘准确率在九成以上,对复杂嵌套视图、子查询、窗口函数的支持也都比较理想,而基于通用SQL解析器的方案,准确率会明显低一些,很多写法直接解析失败。如果你在建设过程中还没有明确选型,我建议优先考虑和自身引擎体系匹配的执行计划方案,语言层面解析器反而容易成为瓶颈。

需要特别提一个坑:从解析器拿到的血缘,和目标表的实际血缘并不完全一致。原因是很多SQL里存在函数处理、条件判断、多重嵌套的子查询,解析器能识别一部分,但不一定能覆盖所有表达式。我在项目里通常会把解析结果放到一个待校验的池子里,数据开发工程师在日常发布时顺手核对本任务的自动解析结果,确认血缘关系无误后点击确认,这个“审核确认”的动作能让血缘系统的准确率稳定在一个比较高的水平。

3.1.2 血缘断点与人工补录

血缘系统的现实情况是:自动解析永远做不到100%, 你一定会在生产里遇到各种解析断点。

常见的断点场景有这么几类:

  • 存储过程/脚本逻辑:复杂的存储过程里,动态SQL、游标、临时表满天飞,钢线式SQL解析器基本无能为力。我之前处理过一个客户的数据仓库,存储过程加工的表占了将近一半,这块血缘分全靠人工补。
  • 非SQL加工场景:比如通过接口调用的方式从源系统拉数据到对象的存储介质,中间没有经过SQL,这种数据流转方式血缘系统根本不认识。
  • 临时表/中间表传递:SQL里先INSERT到临时表再读临时表加工,如果解析器没有把临时表的中间关系串联起来,血缘就会在临时表这个节点断掉。

处理血缘断点,我的建议是分三步走:第一步,把断点列表按影响范围排序,优先处理下游消费范围广、影响分析价值高的链路;第二步,开发人工补录界面,让数据开发人员手动画出断掉的那段关系,补录时要记录补录人和补录依据,方便后续审计;第三步,把补录信息回填到血缘池子里,下次解析时如果遇到同类模式,尝试自动匹配。

人工补录还有一个隐藏价值:等你积累了足够的补录数据,完全可以基于这些样本反向训练或优化解析策略。我在一个项目里发现很多断点其实是同一种模式,优化之后断点率下降了将近一半。

4. 血缘的典型应用场景:影响分析、溯源与认责

血缘不是建完就完事的“面子工程”,它真正的生命力体现在应用上。下面三个场景是我在项目里落地价值最明显的,每一个都直接解决实际业务痛点。

4.1 影响分析:变更前的“地震预估”

影响分析是数据血缘最高频、最刚需的应用场景,没有之一。数据仓库的日常运营中,表的字段会调整、类型会变更、分区策略会改,任何一次变更都可能对下游造成破坏性影响。

我拿真实场景举例:某个指标体系要调整,计划删除某张底层明细表的amount字段。如果靠人工问“哪些下游在用这张表”,问一圈也问不全,而且问到的信息也不一定准确。有了血缘关系,把这张底层表输入影响分析工具,系统立刻列出所有直接和间接下游:哪些报表在引用、哪些指标在加工、哪些API在输出。我见过一个比较典型的分析结果,一张底层表被将近两百家下游消费,其中直接使用到待删除字段的下游任务占了三分之一。如果没有血缘,这些影响要在凌晨调度跑挂的时候才能暴露,那代价就是直接的业务事故。

影响分析的关键是支持“任意节点出发,多级影响展开”。这背后的实现并不神秘,底层就是一个图遍历算法,血缘本身以有向图存储,分析时从起点沿着出边方向游走,每走一层记一个级别,最终输出完整的传播链路。比较实用的一点是,影响图展示时要支持按层级折叠,不然全展开就是一坨难以阅读的网。

另外,影响分析要结合“运营动作”才闭环,光出报告不行。我建议把血缘影响分析嵌入到数据开发平台的变更流程里:开发提交变更单时,系统自动进行影响分析,将可能受影响的任务和下游负责人一起列出,由变更人确认。这样既不会碍事,也不会漏事。

4.1.1 数据溯源:口径可追踪

数据溯源大家也常叫“反查”,意思是给定一个指标或者一张报表,沿着血缘关系的逆向方向,追问数据最原始的归属。它的价值在业务沟通中非常明显。

我在某公司参与指标口径对齐时经常遇到类似问题:“你们报表上的客户数为什么和我们部门统计的不一致?”没有血缘关系,两边只能靠纯人肉翻代码对口径,效率低还容易核对错。有了血缘之后,从报表指标节点反向追踪,能看到这个指标在DWS层是怎么聚合的、在DWD层怎么过滤的、最终底表取自哪个源系统,每一步的加工逻辑也一目了然。核对两个口径之间从哪个节点开始分流,光速就能定位问题所在。

到字段级血缘的话,溯源能力会更强。不仅能看到“客户数”来自哪张表,还能看到它关联的具体字段,以及在加工链路里经历了哪个过滤条件和聚合函数。这比看一段完整SQL要直观得多。我在实际体验中发现,业务方第一次看到这个口径链路时,通常的反应是“原来这个数是这样算出来的”,之前的争执一下子就有了依据。

4.1.2 质量认责与资产盘点联动

血缘还有一个应用场景容易被忽略:数据质量问题的定责和支持。我在项目里把血缘和数据质量监控做了串联,某张核心表的质量规则每天运行,一旦有异常,顺着血缘关系就能快速定位问题可能出在上游哪个环节。是源系统数据缺失?是某层ETL脚本清洗逻辑写错?还是中间层的关联条件变化导致数据膨胀?每排查一步,就顺着血缘图往下追一层,找到源头的时间通常能压缩一半以上。

有了血缘和owner的绑定,认责自动化也更顺畅。血缘图上每个节点都有对应的负责人,问题链路定位之后,系统自动生成一张“责任链路通知单”,把这个链路涉及的owner全部通知到位。这个机制不是为了追责,而是为了把响应环节缩短,减少“找到是谁的问题”这个阶段的空转时间。我在一个客户那边上线了这套逻辑之后,数据质量工单平均响应时间从原来的按天算缩短到了小时级。

5. 数据资产管理体系建设中的问题与排查技巧

这个章节我不按教科书套路列架构,我直接把这些年踩过的坑和对应解法记录下来,看到和你的场景对得上,就能省一大段探索成本。

5.1 元数据采集失败的常见问题

第一类问题:采集任务连数据源超时。真实环境里元数据采集系统要去连各种各样的数据源,库在大规模更新的时候,元数据采集任务很可能一直拿不到锁。我的排查思路是先查看目标库当时的负载和时间窗口,尽量把采集任务安排到业务低峰期,并且给采集任务配置超时自动重试,一般两到三次重试就能稳定通过。

第二类问题:增量同步的数据对不上。不少企业的数据源表数量非常多,每次全量采集代价太大,就要设计增量策略。如果源系统没有提供明确的更新时间和行数变化标识,增量同步的边界很容易出问题,表现为元数据里记录的字段数量和真实表字段不一致。我建议在增量更新策略上做“版本对比”机制,每次采集时拿到当前结构快照和上一次快照做差异比对,不管有没有触发增量条件,都以快照差异为准。这个方法很简单但非常有效。

第三类问题:特殊数据库方言的坑。某类数据库的系统表结构和其他数据库差异很大,字段注释、分区信息、存储参数这些信息的获取方式完全不同。你刚开始扩展新数据源类型时,一定要先在这个数据源类型里造一套覆盖各种字段类型、分区策略、权限控制的测试表,专门用来验证采集逻辑。没有这套测试集,等接真实复杂库表时大概率采出脏数据。

故障类型可能原因处理建议
采集超时数据源负载高、锁等待低峰期调度、超时重试、并发度限制
结构不对齐增量策略缺陷、无版本对比快照差异比对、全量定期校准
方言兼容失败数据库特性差异大先建覆盖性测试库表验证
权限不足采集缺失数据源账号权限不够最小权限审计、分开采集与读取账号

5.2 血缘缺失与解析失败的排查

血缘不会百分百自动生成,你已经知道了。但“哪些能自动解析”和“哪些必须人工补录”之间,通常经过一段时间的统计和磨合才能形成清晰的边界。我总结了一套排查血缘问题的有效方法:

第一步,先给血缘数据做一个覆盖率统计。统计维度通常是计算两类的覆盖率:一类是任务依赖血缘覆盖率,一类是字段血缘覆盖率。这个数字能告诉你当前系统的血缘可依赖程度。如果覆盖率太低,先别急着追求字段级上下链路全通,从关键核心链路入手,把最有业务价值的一两百条链路盘清楚,远比追求全量有效率得多。

第二步,逐个分析解析失败或血缘缺失的任务,找出失败的原因模式。我见过常见的模式包括:存储过程体量过大、多个SQL逗号拼接、SQL里嵌套了奇怪的注释格式、使用了引擎不支持的语法结构。把这些模式整理成清单,交给开发去优化解析器,通常比盲目地全部人工补录性价比高很多。

第三步,人工补录时要确定“谁补、补什么、怎么补”。我的习惯是:下游表owner补向上连接,也就是告诉系统“我是从谁加工来的”;如果两边都拿不准,就通过数据开发团队在调度配置里手动指定上游依赖关系。补录完成之后记得打上“人工补录”的标签,方便后续回溯和校验。

另外一个容易忽略的血缘问题是“血缘冗余”,也就是血缘图里存在与实际调度链路不一致的现象。比如某个任务是每天凌晨跑全量更新,血缘自动解析把它的所有历史版本SQL都算作血缘关系,这时候血缘图上会出现很多“幽灵边”。我在项目里都会在血缘系统里新增一条属性叫“血缘生效时间窗口”,过滤掉那些虽然SQL里存在但实际已经不在调度执行关系里的边,这样整个血缘图谱会干净很多。

5.3 血缘数据的质量评估

最后聊聊血缘系统自身的质量怎么衡量。有些团队建完血缘系统后不知道怎么评估自己的血缘建得对不对,要么盲目相信解析结果,要么总觉得哪不对但说不出依据。

这个阶段,有几个质量指标我是必看,建议你也在平台上沉淀这几个数值:

  • 血缘覆盖率:有血缘关系的表数占总表数的比例,建议按核心表和普通表分开统计,核心表覆盖率目标九成以上,普通表可以适当放宽。这个数字是最直观的基建进度条。
  • 血缘准确率:抽样人工核验血缘关系与真实加工逻辑是否一致,准确率目标九成以上。准确率不关键?关键。血缘如果错误,影响分析就可能把风险漏掉,宁可不展示也不能展示错的。
  • 血缘完整度:链路平均经过的节点数、最长链路深度、孤立节点数量。这些维度反映了整个数据资产的连接丰富程度。孤立节点多意味着大量资产尚未纳入血缘管理体系。
  • 血缘时效性:血缘数据从任务执行完成到更新到图谱里的时间差,一般控制在分钟级到小时级。如果血缘缓存太久,下游要看的是实时依赖关系,看到的却是一天前的旧数据,容易产生误导。

血缘质量评估这一步做完,你的数据资产管理基本就能摆脱“拍脑袋”阶段,做到心里有数。

6. 写在最后:真实投入产出比与我的建议

数据资产管理的建设工作没有标准答案,千人千面的业务场景决定了没有哪个产品能“开箱即用”。但我个人长期跟这类平台打交道的体会是:先把元数据采集这条基础链路彻底跑通,再集中精力攻破血缘自动解析这个核心难点,最后把血缘应用到影响分析这个高频关键场景,这三步走顺序不能乱。

你可能会遇到一个阶段,觉得投入产出比不明显,比如血缘覆盖率的数字卡在六成上不去,人工补录的工作量一直降不下来。这个阶段我也经历过很多次,别慌,这不是平台建设失败,这是从工具建设走向运营驱动的必经阶段。坚持把核心链路补齐、把血缘质量闭环跑起来,等覆盖率和准确率双双过九成之后,血缘系统带来的回报就会特别直接,甚至经常在关键时刻帮团队避免一次大的生产事故。

如果你正准备启动或正在推进数据资产管理模块,我最后再分享一个小技巧:不要一上来就追求大而全的资产目录平台,试着先用“元数据采集+血缘影响分析”这两个能力切入一个具体的业务痛点,把一条核心链路完整走通。有了一个清清楚楚的成功案例做标杆,后续的资源支持和业务配合都会顺畅很多。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进