在写架构之前,先明确需求边界。一个企业级数据治理平台,核心要解决四类问题:
围绕这四个问题,数据治理平台通常包含六大能力域:元数据管理、数据标准管理、数据质量管理、数据安全管理、数据生命周期管理、数据资产目录。
下面按模块逐个拆解技术选型和架构设计。
┌─────────────────────────────────────────────────────────────┐
│ 用户交互层 │
│ 数据资产目录 │ 质量监控大屏 │ 血缘可视化 │ 安全审计 │
├─────────────────────────────────────────────────────────────┤
│ 服务层 │
│ 搜索服务 │ 血缘分析服务 │ 质量引擎 │ 权限服务 │
├─────────────────────────────────────────────────────────────┤
│ 数据处理层 │
│ 元数据采集 │ 质量检核 │ 数据分类 │ 血缘解析 │
├─────────────────────────────────────────────────────────────┤
│ 存储层 │
│ 元数据存储(图数据库) │ 检核结果存储 │ 搜索索引(ES) │
├─────────────────────────────────────────────────────────────┤
│ 数据源层 │
│ Hive │ MySQL │ Kafka │ HBase │ 各类RDBMS │ 对象存储 │
└─────────────────────────────────────────────────────────────┘分层思路:数据源层对接各类异构数据源;数据处理层负责采集、解析、检核;服务层提供统一 API;交互层面向不同角色的用户。
在进入模块选型之前,有三个全局性的技术决策需要先定。
决策一:元数据存储选图数据库还是关系型数据库?
数据治理平台最核心的数据结构是元数据的血缘关系——一张表从哪张表加工而来、一个字段对应源表的哪个字段。这种数据天然是图结构。用关系型数据库存储血缘关系,要做多层递归查询,表越多性能越差。图数据库(Neo4j 或 JanusGraph)一次图遍历就能拿到完整链路。
建议:元数据关系(血缘、分类、标签)用图数据库,业务元数据和检核结果用关系型数据库(MySQL/PostgreSQL),搜索引擎用 Elasticsearch。
决策二:元数据采集用 Pull 还是 Push?
Pull 模式:平台主动去数据源拉取元数据。优点是集中调度、对数据源无侵入。缺点是实时性差,通常 T+1。
Push 模式:数据源通过 SDK 或 Hook 主动上报元数据变更。优点是实时性好。缺点是需要数据源侧改造。
建议:核心数据源(Hive、Spark)用 Hook 做实时采集,外围数据源(MySQL、PostgreSQL)用定时 Pull。两者共存,通过消息队列(Kafka)统一接入。
决策三:开源还是商业?
当前开源方案已经相当成熟。Atlas(Apache 顶级项目)在 Hadoop 生态中近乎标配,DataHub(LinkedIn 开源)在实时性和 UI 体验上更优,Amundsen(Lyft 开源)在数据发现场景表现突出。
如果团队有较强的二次开发能力,开源方案是最优解——功能可定制、无 License 成本、社区活跃。如果团队偏业务、缺乏大数据运维能力,可以考虑商业产品 + 咨询服务的组合。
维度 | Apache Atlas | DataHub | Amundsen |
|---|---|---|---|
血缘采集 | Hive Hook 原生支持,Spark 需扩展 | 实时采集架构好,支持 Push | 血缘能力弱,需外接 |
搜索能力 | 基于 Solr/ES,可用但不够快 | ES 深度集成,搜索体验最佳 | 搜索是核心优势 |
UI 体验 | 传统风格,功能全但交互老旧 | 现代 UI,操作流畅 | 专注数据发现,最简洁 |
部署复杂度 | 依赖 HBase + Solr + Kafka,重 | Docker 化部署较友好 | 较轻量 |
社区活跃度 | Apache 顶级项目,稳定但迭代慢 | LinkedIn 持续投入,迭代快 | 中等 |
分类/标签 | Type System 灵活,支持自定义 | 标签体系完善 | 偏弱 |
适用场景 | Hadoop 生态、血缘强需求 | 实时性要求高、UI 要求高 | 数据发现、自助查询 |
如果团队在 Hadoop/Spark 技术栈上,Atlas 是首选。血缘采集通过 Hive Hook 和 Spark Listener 几乎是零侵入的——在 HiveServer2 和 Spark 配置里加一行 hook 类名即可。对数据开发完全透明,不需要改任何 SQL 和代码。
如果数据源种类多、对实时性要求高,DataHub 更合适。它的采集架构基于 Kafka 事件流,元数据变更秒级可达。UI 方面,DataHub 的搜索和数据目录体验明显优于 Atlas,更适合面向业务用户。
两种方案也可以组合:Atlas 做血缘采集和存储,DataHub 做数据目录和搜索前端。但这种混搭方案需要维护两套元数据存储之间的同步,运维成本会上升。团队规模小于 5 人的话,不建议。
┌──────────────────────────────────────────────┐
│ 规则配置层 │
│ SQL规则 │ 自定义规则 │ 模板规则 │ 阈值配置 │
├──────────────────────────────────────────────┤
│ 调度引擎 │
│ DolphinScheduler / Airflow + 规则解析 │
├──────────────┬───────────────┬───────────────┤
│ 离线检核 │ 实时检核 │ 一致性检核 │
│ (Spark SQL) │ (Flink/Kafka) │ (跨源对比) │
├──────────────┴───────────────┴───────────────┤
│ 结果存储与告警 │
│ MySQL │ ES │ 钉钉/企微/邮件告警 │
├──────────────────────────────────────────────┤
│ 问题闭环 │
│ 工单创建 → 根因定位 → 修复 → 验证 → 关闭 │
└──────────────────────────────────────────────┘规则引擎:建议分三层。
第一层是模板规则,覆盖最常见的六类质量维度——完整性(非空检查)、准确性(值域范围)、一致性(跨表对比)、时效性(数据更新延迟)、唯一性(主键重复)、有效性(格式校验)。用户选模板填参数即可,不用写 SQL。
第二层是自定义 SQL 规则,给高级用户灵活度。规则引擎解析 SQL 模板,替换参数后提交到 Spark 执行。
第三层是自定义 UDF,当 SQL 表达不了复杂逻辑时使用。比如需要对某个字段做正则匹配后再做业务判断,写一个 Spark UDF 注册到规则引擎里。
检核引擎:离线检核用 Spark SQL 批量处理,适合 T+1 的大表全量检核。实时检核用 Flink,在数据写入时做流式校验,适合对数据入库质量有秒级要求的场景。一致性检核是跨源对比——比如 MySQL 里的订单量和 Hive 数仓里的订单量是否一致——通过 Spark 同时读取两个数据源做 diff。
调度:选 DolphinScheduler 或 Airflow 均可。DolphinScheduler 的优势是分布式、可视化 DAG、中文社区活跃,国内团队用起来更顺手。Airflow 的优势是生态成熟、插件丰富。两者都能满足需求,选团队熟悉的。
数据标准管理在工程上有一个核心矛盾:标准定义在文档里,但标准需要被强制执行在系统里。
标准的落地需要两个动作:定义和执行。
定义层:建一个标准字典库,存数据项的标准名称、业务定义、数据类型、长度、值域范围、编码规则。底层用 MySQL,前端用表单配置。
执行层:这才是难点。标准怎么在数据开发过程中被强制执行?答案是把标准和数据建模工具打通。
具体做法:在数据开发平台的新建表流程中,强制引用数据字典。建表时输入字段名,系统自动从字典里匹配标准数据项——如果匹配上了,字段名、类型、注释都按标准自动填充,不允许随意修改。如果匹配不上(这个字段在字典里没有),触发"新增数据标准申请"流程,数据 Owner 审批后才能建表。审完的同时,这个新数据项也被加入字典。
这样标准字典就不再是"写完就没人看的文档",而是数据开发的必经入口。
第一步是做数据分级。建议分四级:公开(可对外)、内部(公司内可查看)、敏感(部门内可查看,如经营数据)、机密(指定人员可查看,如薪酬数据)。
分类的执行可以通过 Atlas 的 Classification 机制。在元数据采集时,通过正则匹配字段名(如匹配 .*phone.*、.*id_card.*)自动打上敏感标签,再由数据 Owner 人工确认。这样能覆盖 80% 以上的敏感数据识别,减少人工标注成本。
权限控制分两层。
底层是 Ranger 或 Sentry,在 Hive/HBase/Kafka 层面做细粒度权限控制——哪个用户/用户组能访问哪个库、哪张表、哪个字段。
上层是数据治理平台的访问控制——谁能看数据目录、谁能编辑数据标准、谁能配置质量规则。这层权限通常对接企业已有的统一认证系统(LDAP/SSO),通过 RBAC 模型管理。
两层权限需要打通:数据治理平台上配置的权限策略,同步到 Ranger 的策略里生效。这个同步可以通过 Ranger 的 REST API 实现。
这个模块在大多数数据治理平台中被边缘化了,但它直接影响存储成本。
核心逻辑是一个定时任务:每天扫描 Hive 表的 last_access_time(最后访问时间),根据分区的时间戳判断数据冷热。
实现上,用 Spark 扫描 Hive Metastore 获取分区元数据,生成迁移计划,通过 DistCP 做数据迁移。整个过程由一个定时 DolphinScheduler 任务编排。
对于日均数据量在 10TB 以内、团队规模 5-20 人的典型场景:
组件 | 推荐选型 | 资源配置 |
|---|---|---|
元数据存储(图) | JanusGraph + HBase | 3 节点, 16C/32G |
元数据存储(关系) | MySQL 8.0 | 主从, 8C/16G |
搜索引擎 | Elasticsearch 7.x | 3 节点, 8C/16G |
消息队列 | Kafka 2.x | 3 节点, 8C/16G |
检核引擎 | Spark on YARN/K8s | 弹性资源, 按需申请 |
调度引擎 | DolphinScheduler 3.x | 2 节点, 4C/8G |
血缘解析 | Atlas + Hive Hook | 复用图数据库资源 |
可视化前端 | Nginx + React | 2 节点, 4C/8G |
总计约 15-18 台机器(含 Hadoop 集群复用)。如果数据源和 Hadoop 集群是已有的,新增资源大概在 6-8 台虚机。
不建议一上来就六大模块全线开工。推荐的节奏是:
第一阶段(1-2 月):元数据管理 + 数据资产目录。先把"有什么数据"这件事搞清楚。部署 Atlas + ES,接入核心数据源的元数据采集。产出数据地图和基础搜索能力。
第二阶段(3-4 月):数据质量检核。在元数据的基础上,配置核心表的质量监控规则。先上完整性、准确性、及时性三类。接入告警和工单。
第三阶段(5-6 月):数据标准 + 数据安全。有了元数据和质量的底子,再做标准管理和安全分级。标准管理对接数据开发平台,安全分级对接 Ranger。
第四阶段(7 月起):生命周期管理 + 持续运营。前面三个模块跑稳了,再上数据生命周期管理。同时建立运营机制:每月质量复盘、每季度标准修订。
企业级数据治理平台的建设,技术上没有特别高的壁垒——开源组件已经足够成熟,架构模式也经过了大厂的验证。真正的难点不在选型,而在落地:元数据采集能不能做到对业务零侵入、质量检核能不能形成问题闭环、数据标准能不能嵌入开发流程而不是停留在文档里。
选型建议:血缘强需求 + Hadoop 生态 → Atlas;实时性 + UI 体验 → DataHub;搜索优先 + 轻量部署 → Amundsen。检核引擎统一走 Spark + DolphinScheduler。安全和权限走 Ranger。不要一开始就追求架构完美,先在一个业务域跑通闭环,再逐步扩展。
本文基于个人在数据治理工程领域的实践经验整理,所有技术方案仅供参考,实际选型需结合团队技术栈和业务场景。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。