如何通过Apache Atlas构建Yugabyte DB的数据血缘系统
YugabyteDB + Apache Atlas 自动同步数据血缘实现方案
基础实体对齐
你之前梳理的4类核心实体的思路是对的,结合Atlas内置类型模型不用从零自定义:
- 存储在YugabyteDB的TABLE A、TABLE B直接复用Atlas内置的
rdbms_table类型,对应的库、schema、字段实体也直接复用RDBMS域的内置模型,YugabyteDB兼容PostgreSQL协议,不需要额外开发自定义表类型 - Python聚合处理逻辑、报表生成逻辑对应
process类型的实体,你可以根据需要扩展子类型比如python_etl_process、bi_report_generation,给流程加函数版本、负责人、调度周期这类自定义属性;report x本身作为bi_report类型实体存在,不要和生成流程混为同一个实体,避免后续链路延伸时血缘断档 - 实体间关联直接用Atlas默认的血缘关系:流程实体通过
inputs关联上游输入表/实体,通过outputs关联下游输出表/实体即可
新增数据、新链路自动同步实现
不需要每次有新表、新处理逻辑就手动调用API维护血缘,分三层做自动采集即可:
1. YugabyteDB侧元数据自动同步
- 开启YugabyteDB的CDC(变更数据捕获)能力,监听所有业务库的DDL(新建表、字段变更、删表)、DML事件,事件输出到Kafka队列即可
- YugabyteDB CDC输出格式和PostgreSQL逻辑复制协议完全兼容,直接适配Atlas内置的RDBMS元数据消费器即可:新表创建、表结构变更、表删除这类操作会自动同步到Atlas,创建/更新/标记对应的表实体,不需要人工介入
- 首次上线先做一次全量元数据初始化,把现存的所有表、字段批量导入Atlas,再开启CDC做增量同步,不会出现实体缺失的问题
2. Python ETL链路血缘自动采集
不要手动维护每个Python处理函数的血缘关系,直接在数据处理层做轻量埋点:
- 如果你是通过SQL读写YugabyteDB,在SQL执行入口加解析逻辑,用SQL解析器自动识别每个读写操作的输入表、输入字段、输出表、输出字段
- 如果你是通过pandas等DataFrame框架做计算,拦截框架的读库、写库方法,自动捕获读取的源表、写入的目标表
- 每个Python函数执行成功后,自动组装流程实体和血缘关系数据,通过Atlas的批量实体接口上报,上报时用固定规则生成实体唯一键(比如Python流程的唯一键设为
python_etl:<函数全路径>:<代码版本>,表实体唯一键设为yb:<集群标识>:<库名>:<schema名>:<表名>),做幂等校验,重复上报不会生成重复实体。新开发的Python处理逻辑只要走统一的执行入口,跑一次任务就会自动把血缘同步到Atlas,不需要额外配置。
3. 报表侧血缘自动同步
- 如果report x是通过通用BI工具生成,直接复用Atlas对应BI工具的采集能力,监听BI侧的报表新建、数据集更新事件,自动捕获报表依赖的上游表、生成流程,同步建立关联
- 如果是自定义代码生成报表,复用Python ETL层的埋点逻辑即可,拦截报表生成时的数据源读取、报表输出动作,自动上报血缘关系
落地优化点
- 给所有自动采集的实体加统一标签,比如
collect_type:auto_cdc、collect_type:python_hook,后续排查问题、清理无效实体时方便筛选 - 给血缘上报加失败重试机制,避免网络波动导致的血缘缺失
- 定期跑血缘一致性校验任务,对比Yugabyte实际存在的表、调度系统实际运行的任务和Atlas里的实体,补全缺失的血缘片段
内容的提问来源于stack exchange,提问作者Tapas Kumar Pradhan
相关产品推荐
相关产品推荐

