3、数据源接入与元数据管理:特征数据源的分类(离线/实时),元数据采集与注册,数据血缘关系的建立

数据源接入,说白了就是搞清楚你的特征到底从哪来。我见过不少团队,特征上线跑得飞快,一出问题就抓瞎——不知道数据源头在哪,不知道中间被谁改过,不知道下游哪些模型在用。嗯,这就是元数据管理和血缘关系没做好。

这一章,我们就来聊聊怎么把数据源管清楚。我会从数据源分类讲起,再到元数据怎么采、怎么注册,最后把血缘关系串起来。

3.1 特征数据源的分类:离线与实时

特征数据源,按时效性分两大类:离线数据源和实时数据源。这两者在接入方式、存储选型、质量监控策略上完全不同。

维度 离线数据源 实时数据源
典型存储 Hive、HDFS、离线数仓(ODS/DWD层) Kafka、Pulsar、Redis、HBase
更新频率 T+1、小时级 秒级、毫秒级
数据量级 TB~PB级,全量或大分区 MB~GB级,流式增量
接入方式 批处理调度(Spark、MapReduce) 流处理引擎(Flink、Spark Streaming)
质量监控重点 数据完整性、分区空值、跨天一致性 延迟、乱序、吞吐量、数据丢失

我个人习惯,在搭建监控体系之前,先画一张数据源全景图。把每个特征对应的离线表和实时Topic都列出来,标注清楚数据源类型、负责人、存储路径。这一步做扎实了,后面元数据采集才不会漏。

核心原则:离线数据源关注“有没有、全不全”,实时数据源关注“快不快、准不准”。监控指标和告警阈值要分开设。

3.2 元数据采集与注册

元数据,就是关于数据的数据。特征元数据至少包含:特征名称、所属实体、数据类型、数据源位置、更新频率、业务含义、负责人。你想想看,如果没有这些信息,一个特征出了问题,你连找谁问都不知道。

我在项目中遇到过,一个团队用Excel管理特征元数据,结果版本混乱,同一个特征在不同模型里含义都不一样。后来我们统一用Atlas + 自研元数据服务,才把这事理顺。

3.2.1 元数据采集的两种方式

  • 主动采集(Pull模式):定时扫描Hive MetaStore、Kafka Topic列表、Redis Key模式,自动提取元数据。适合大规模、自动化场景。
  • 被动注册(Push模式):特征开发者在平台上手动填写或通过API注册特征元数据。适合需要人工审核、补充业务语义的场景。

我建议两种方式结合:主动采集兜底,保证元数据不遗漏;被动注册补充业务信息,比如特征含义、使用场景、负责人。

3.2.2 元数据注册的核心字段

字段 说明 示例
feature_id 全局唯一特征ID f_001_user_age
feature_name 特征名称 user_age
entity_type 所属实体 user
data_type 数据类型 int
source_type 数据源类型 offline / realtime
source_path 数据源位置 hive://dw.user_profile/age / kafka://topic_user_attr
update_frequency 更新频率 daily / hourly / realtime
owner 负责人 zhangsan@company.com
description 业务含义 用户注册时的年龄

小技巧:元数据注册最好和特征生成流水线绑定。特征上线时自动触发注册,下线时自动标记废弃。避免人工维护导致的“僵尸特征”。

3.3 数据血缘关系的建立

数据血缘,就是特征从源头到最终使用的完整链路。比如:原始日志 → ETL清洗 → 离线特征表 → 特征拼接 → 模型训练。一旦特征质量出问题,血缘能帮你快速定位是哪个环节出了岔子。

我曾经因为没建血缘,排查一个特征异常花了三天。后来发现是上游ETL改了字段名,下游没同步。如果当时有血缘图,十分钟就能定位。

3.3.1 血缘的粒度

  • 表级血缘:特征表依赖哪些上游表,被哪些下游任务消费。适合宏观排查。
  • 字段级血缘:特征字段从上游哪个字段来,经过什么转换。适合精准定位。

我个人习惯,字段级血缘必须做。因为很多特征异常是字段映射错误导致的,表级血缘根本看不出来。

3.3.2 血缘采集的实现方式

常见的做法是解析SQL和ETL脚本,提取输入输出关系。比如Spark SQL的QueryExecution、Hive的LineageInfo、Flink的Table API都能提供血缘信息。

-- 示例:解析SQL血缘
-- 输入表:dw.user_profile
-- 输出表:feature.user_age
-- 字段映射:dw.user_profile.age -> feature.user_age.age_value

INSERT OVERWRITE TABLE feature.user_age
SELECT user_id, age AS age_value
FROM dw.user_profile
WHERE dt = '${bizdate}'

采集到的血缘数据,可以存入图数据库(如Neo4j)或关系型数据库,方便查询和可视化。

3.3.3 血缘可视化

下面这张图,展示了一个典型特征的血缘链路。从原始日志到最终模型,每个环节都清晰可见。

特征血缘链路示例 原始日志 ETL清洗 离线特征表 特征拼接 模型训练 血缘作用 • 快速定位异常环节 • 评估变更影响范围 • 辅助质量回溯分析

注意:血缘关系不是一次建好就完事的。数据源、ETL逻辑、特征计算方式都会变。我建议每天增量更新血缘,每周全量校验一次。否则血缘图会慢慢变成一张“死图”。

3.4 数据源接入与元数据管理的落地要点

说了这么多,总结几个我在实战中踩过的坑和沉淀下来的经验:

  • 数据源接入必须标准化:统一接入协议、统一命名规范、统一监控埋点。不要给每个数据源单独写接入代码,否则后期维护成本爆炸。
  • 元数据是监控的基础:没有元数据,质量监控就是盲人摸象。特征名、数据源、负责人、更新频率,这四个字段必须100%覆盖。
  • 血缘要建到字段级:表级血缘只能告诉你“谁依赖谁”,字段级血缘才能告诉你“哪个字段出了问题”。
  • 自动化是王道:元数据采集、血缘解析、质量监控,能自动化的就不要手动。手动操作越多,遗漏和错误越多。

一句话总结:数据源接入是地基,元数据管理是图纸,血缘关系是管线图。这三样做好了,特征质量监控体系才能立得住。