1. 四款元数据平台选型的真实背景
数据治理这个领域,做了几年之后你会发现一个规律:真正难的不是采集数据,而是搞清楚"我们到底有哪些数据、它们长什么样、谁在用、从哪来到哪去"。元数据管理平台就是干这个的。过去几年里,我参与过三个中大型数据平台的元数据系统选型和落地,从最早的 Apache Atlas 到后来的 DataHub、OpenMetadata,再到最近开始关注的 Apache Gravitino,几乎每一款都踩过坑,也都有让我觉得"这东西真香"的时刻。
这篇文章不打算写成官方文档的翻译版,而是从一个一线数据平台工程师的视角,把 OpenMetadata、DataHub、Atlas、Gravitino 这四款放在一起做一次彻底的横向拆解。我会讲清楚它们各自的设计哲学、核心架构、部署实操、常见坑,以及在不同规模团队里到底该怎么选。如果你正在做元数据平台的选型,或者已经上了其中某一款但用得很别扭,这篇内容应该能帮你省下不少试错时间。
先给一个最粗的定位,方便你建立第一印象:
- Apache Atlas: Hadoop 时代的元数据老兵,强在血缘和分类体系,但架构偏重,社区活跃度下滑明显。
- DataHub: LinkedIn 开源,推事件驱动架构,元数据实时性强,生态插件丰富,适合中大型互联网团队。
- OpenMetadata: 后起之秀,主打"开箱即用"和统一元数据模型,UI 和协作体验做得最好,适合想快速落地的团队。
- Apache Gravitino: 新一代联邦式元数据湖方案,主打多源异构元数据的统一接入和虚拟化,定位和前三个有本质区别。
这四款不是简单的"谁替代谁"的关系,它们解决的问题层次不一样。下面我会一层层拆开讲。
2. 四款平台的核心设计哲学对比
2.1 从"元数据仓库"到"元数据操作系统"的演进
理解这四款产品的差异,最关键的是理解它们各自诞生的时代背景和要解决的核心矛盾。
Atlas 诞生于 2015 年前后,那时候 Hadoop 生态如日中天,Hive、HBase、Kafka 是数据平台的主力。Atlas 的核心任务是给这些 Hadoop 组件建立统一的元数据目录和血缘关系。它的设计思路是"元数据仓库"——所有元数据集中存储,通过 Hook 机制从各个组件采集。这个思路在当时是先进的,但问题是它和 Hadoop 生态绑定太深,扩展性受限。
DataHub 诞生于 2019 年,LinkedIn 内部先用了几年才开源。它的核心创新是"事件驱动"——元数据不是定时批量采集,而是通过事件流实时更新。这个设计让 DataHub 在元数据新鲜度上有天然优势。同时它采用了"读写分离"的架构,前端查询走 Elasticsearch,后端存储走 MySQL/PostgreSQL,扩展性比 Atlas 好很多。
OpenMetadata 诞生于 2021 年,是四款里最年轻的。它的设计哲学是"统一元数据模型 + 开箱即用"。OpenMetadata 定义了一套标准的元数据 Schema,所有接入的数据源都要映射到这套 Schema 上。这个设计的好处是跨源查询和关联分析非常顺畅,坏处是接入新数据源时需要做 Schema 映射,有一定工作量。
Gravitino 是 2023 年才进入 Apache 孵化器的项目,它的定位和前三个完全不同。Gravitino 不是要做"元数据管理平台",而是要做"元数据湖"——它提供一层统一的元数据抽象,让上层引擎(Spark、Flink、Trino 等)可以透明访问底层各种数据源(Hive、Iceberg、Hudi、MySQL 等)。你可以把它理解成"元数据层面的虚拟化层"。
2.2 架构层面的关键差异
把四款产品的架构放在一起对比,差异会非常明显:
| 维度 | Atlas | DataHub | OpenMetadata | Gravitino |
|---|---|---|---|---|
| 核心架构 | 集中式元数据仓库 | 事件驱动 + 读写分离 | 统一模型 + API 优先 | 联邦式元数据湖 |
| 存储后端 | JanusGraph (HBase/BerkeleyDB) | MySQL/PG + ES + Kafka | MySQL/PG + ES | 可插拔(RDBMS/内存等) |
| 采集方式 | Hook + 批量 | 事件流 + 批量 | API + 批量 + 事件 | 虚拟化接入 |
| 血缘能力 | 强(列级) | 强(列级 + 实时) | 强(列级 + 可视化) | 弱(侧重访问路径) |
| 扩展性 | 一般 | 好 | 好 | 极好 |
| 上手难度 | 高 | 中 | 低 | 中 |
这个表格里最值得说的是存储后端。Atlas 用 JanusGraph 作为图存储,这个选择在当年很合理,因为血缘本质是图关系。但 JanusGraph 的运维复杂度很高,尤其是底层用 HBase 的时候,出问题排查起来非常痛苦。DataHub 和 OpenMetadata 都选择了"关系型数据库 + 搜索引擎"的组合,运维简单很多,代价是血缘查询需要应用层做图遍历,深度血缘查询性能不如原生图数据库。
Gravitino 的存储后端是可插拔的,这是它作为"元数据湖"的必然选择——它不关心元数据存在哪,只关心能不能统一访问。
2.3 选型时最容易忽略的三个维度
大部分人选型时只看功能列表,但实际落地后真正影响体验的是这三个维度:
第一,元数据模型的灵活性。Atlas 的模型是固定的,你想加一个自定义属性,得改 TypeSystem 定义,还要重启服务。DataHub 和 OpenMetadata 都支持自定义属性,但 OpenMetadata 的自定义属性可以直接在 UI 上配置,DataHub 需要改 Schema 定义。Gravitino 的模型是面向数据源的,灵活性最高但也最抽象。
第二,权限模型的粒度。这个在企业环境里极其重要。Atlas 的权限模型基于 Ranger,粒度到资源级别。DataHub 有独立的权限体系,支持到字段级别。OpenMetadata 的权限模型最细,支持到操作级别(比如"只能看不能改")。Gravitino 的权限模型还在演进中。
第三,API 的完备性。元数据平台不可能只用 UI,一定要和内部系统集成。Atlas 的 API 是 REST 风格但文档一般。DataHub 有 GraphQL API,功能强大但学习曲线陡。OpenMetadata 的 API 文档最完善,还有 SDK。Gravitino 的 API 是 REST 风格,设计得很干净。
3. 部署实操:从零到跑起来
3.1 Atlas 部署:HBase + Solr + Kafka 的三件套
Atlas 的部署是四款里最复杂的,因为它依赖的组件最多。标准部署需要 HBase(存储)、Solr(索引)、Kafka(通知),再加上 Atlas 本身。
我用 Docker Compose 部署过很多次,这里给一个精简版的思路。首先你需要一个 HBase 集群,单机版可以用 standalone 模式,但生产环境一定要用分布式。Solr 建议用 SolrCloud 模式,单机版在元数据量大时会很慢。Kafka 用单节点就够,Atlas 只用它做通知。
部署顺序很重要:先起 HBase,再起 Solr,再起 Kafka,最后起 Atlas。Atlas 启动时会去连这三个组件,任何一个没起来都会导致启动失败。
# 以 Docker 方式启动 Atlas 依赖组件(示意) docker run -d --name atlas-hbase -p 2181:2181 -p 16000:16000 \ harisekhon/hbase:latest docker run -d --name atlas-solr -p 8983:8983 \ solr:8.11 solr-precreate vertex_index docker run -d --name atlas-kafka -p 9092:9092 \ confluentinc/cp-kafka:latestAtlas 本身的配置在atlas-application.properties里,关键配置项包括:
atlas.graph.storage.backend=hbase atlas.graph.storage.hostname=localhost atlas.graph.index.search.backend=solr atlas.graph.index.search.solr.zookeeper-url=localhost:2181 atlas.kafka.bootstrap.servers=localhost:9092 atlas.notification.embedded=false注意:Atlas 的
atlas.notification.embedded一定要设为 false,用外部 Kafka。嵌入式 Kafka 在生产环境是灾难,消息堆积后无法排查。
Atlas 部署最大的坑是内存。默认配置下 Atlas 需要至少 4GB 堆内存,HBase 需要 2GB,Solr 需要 2GB,加起来一台机器至少要 8GB 才跑得动。如果内存不够,Atlas 会启动到一半卡死,日志里只报 OOM,很难定位。
3.2 DataHub 部署:Quickstart 与生产部署的差距
DataHub 提供了datahub docker quickstart命令,一条命令就能起一个完整环境。这个命令对新手极其友好,但我要提醒一句:Quickstart 环境绝对不能用于生产。它用的是默认密码、单节点、没有持久化配置,重启就丢数据。
生产部署 DataHub 需要拆成几个部分:前端(datahub-frontend)、后端(datahub-gms)、存储(MySQL + Elasticsearch + Kafka)。官方提供了 Helm Chart,Kubernetes 环境下部署相对顺畅。
# Quickstart 方式(仅用于本地体验) python3 -m pip install --upgrade acryl-datahub datahub docker quickstart # 生产环境用 Helm helm repo add datahub https://helm.datahubproject.io/ helm install datahub datahub/datahub --values values.yamlDataHub 部署时最容易出问题的是 Elasticsearch 的索引配置。DataHub 默认会创建多个索引(datasetindex、chartindex、dashboardindex 等),如果 ES 的number_of_shards设置不合理,元数据量大时查询会非常慢。我的经验是:元数据实体数在 100 万以内,每个索引 3 个分片就够;超过 100 万,建议 5-10 个分片。
另一个坑是 Kafka 的 topic 数量。DataHub 会创建几十个 Kafka topic,如果 Kafka 的num.partitions默认是 1,消费会跟不上。建议把默认分区数调到 3-6。
3.3 OpenMetadata 部署:最省心的一个
OpenMetadata 的部署体验是四款里最好的。它提供了openmetadata-docker仓库,一条docker compose up就能起完整环境。生产环境同样有 Helm Chart。
# 本地快速体验 git clone https://github.com/open-metadata/OpenMetadata-docker.git cd OpenMetadata-docker docker compose up -d # 生产环境 Helm helm repo add open-metadata https://helm.open-metadata.org/ helm install openmetadata open-metadata/openmetadata --values values.yamlOpenMetadata 的依赖组件是 MySQL(或 PostgreSQL)+ Elasticsearch + Airflow(用于 ingestion)。Airflow 是可选的,但如果你要用它的 ingestion 框架,Airflow 是必须的。
OpenMetadata 部署时最需要注意的是 Elasticsearch 的版本。它要求 ES 7.x 或 8.x,但 8.x 的某些版本有兼容性问题。我实测下来,ES 7.17.x 是最稳的。另外 OpenMetadata 的 ingestion 框架依赖 Airflow,Airflow 本身的部署就是个大工程,如果团队没有 Airflow 经验,建议先用它的 API 方式接入元数据,不要一上来就上 ingestion 框架。
3.4 Gravitino 部署:轻量但需要理解新概念
Gravitino 的部署是四款里最轻量的。它本身就是一个 Java 服务,依赖一个关系型数据库(默认用 H2,生产建议 MySQL/PostgreSQL)。
# 下载并解压 wget https://downloads.apache.org/gravitino/.../gravitino-*.tar.gz tar -xzf gravitino-*.tar.gz cd gravitino-* # 配置 MySQL 作为后端 vim conf/gravitino.conf # 修改 gravitino.entity.store.relational.jdbcUrl 等配置 # 启动 ./bin/gravitino.sh startGravitino 部署简单,但它的概念模型需要花时间理解。Gravitino 里有 Metalake、Catalog、Schema、Table 等概念,Metalake 是顶层命名空间,Catalog 是数据源接入点。你要做的第一件事是创建一个 Metalake,然后在里面注册各种 Catalog。
# 创建 Metalake curl -X POST -H "Content-Type: application/json" \ -d '{"name":"my_metalake","comment":"test"}' \ http://localhost:8090/api/metalakes # 注册一个 Hive Catalog curl -X POST -H "Content-Type: application/json" \ -d '{ "name":"hive_catalog", "type":"RELATIONAL", "provider":"hive", "properties":{"metastore.uris":"thrift://localhost:9083"} }' \ http://localhost:8090/api/metalakes/my_metalake/catalogsGravitino 部署的坑主要在版本兼容性上。它和 Iceberg、Hudi 的版本绑定比较紧,如果你的数据湖用的是特定版本的 Iceberg,要先确认 Gravitino 是否支持。
4. 核心功能实操与踩坑记录
4.1 血缘采集:四款产品的真实表现
血缘是元数据平台最核心的功能,也是最能体现产品差异的地方。我分别用四款产品采集过同一套 Hive + Spark 的血缘,结果差异很大。
Atlas 的血缘采集依赖 Hook。Hive Hook 能采集到表级和列级血缘,但需要把 Hook 配置到 Hive 的hive-site.xml里,然后重启 Hive。Spark 的血缘采集需要 Atlas 的 Spark Listener,配置在spark-defaults.conf里。Atlas 的血缘是准实时的,Hook 触发后几秒内就能在 UI 上看到。
DataHub 的血缘采集有两条路:一是通过 ingestion recipe 批量采集,二是通过事件流实时采集。批量采集用datahub ingest命令,配置一个 YAML 文件就行。实时采集需要接入 DataHub 的 MCE(Metadata Change Event)流。DataHub 的血缘展示做得很好,列级血缘可以下钻,还能看到血缘的"新鲜度"。
OpenMetadata 的血缘采集主要靠 ingestion 框架。它的 ingestion 是基于 Airflow 的,配置一个 YAML 文件,Airflow 会定期跑采集任务。OpenMetadata 的血缘可视化是四款里最漂亮的,支持交互式下钻和影响分析。
Gravitino 本身不做血缘采集,它的定位是元数据访问层。血缘需要上层引擎自己上报,或者配合其他工具使用。
这里有个实操心得:血缘采集的准确性比实时性更重要。我见过太多团队追求实时血缘,结果采集到的血缘关系错漏百出,反而误导了使用者。建议先用批量采集把血缘跑准,再考虑实时化。
4.2 元数据接入:从 Hive 到数据湖
元数据接入的复杂度,很大程度上取决于数据源的种类。我按数据源类型分别说一下四款产品的表现。
Hive 接入:四款都支持,Atlas 最原生(毕竟是 Hadoop 生态),DataHub 和 OpenMetadata 通过 ingestion 接入,Gravitino 通过 Catalog 接入。Atlas 的 Hive Hook 是最省事的,配置好之后自动采集,不用写额外代码。
关系型数据库接入:MySQL、PostgreSQL 这些,Atlas 支持一般,需要自己写采集逻辑。DataHub 和 OpenMetadata 都有现成的 ingestion source,配置一下就能用。Gravitino 支持 JDBC Catalog,接入很顺畅。
数据湖接入:Iceberg、Hudi、Delta Lake 这些,Atlas 支持较弱,DataHub 和 OpenMetadata 有插件但成熟度一般,Gravitino 是原生支持,这是它的核心优势。
消息队列接入:Kafka、Pulsar 这些,DataHub 支持最好,有专门的 Kafka Connect 插件。OpenMetadata 也支持,但功能相对简单。Atlas 支持 Kafka 的 topic 元数据,但不支持 Schema Registry 的深度集成。
4.3 权限与安全:企业落地的硬门槛
权限模型这块,我在实际项目中踩过不少坑,这里重点说一下。
Atlas 的权限依赖 Ranger,你需要先部署 Ranger,然后在 Ranger 里配置 Atlas 的权限策略。这个链路很长,而且 Ranger 本身的运维就不简单。Atlas 的权限粒度到资源级别,比如"某个 Database 下的所有 Table",但不支持字段级别。
DataHub 有独立的权限体系,支持 Policy 和 Role 两种模式。Policy 是细粒度的,可以精确到"某个用户对某个字段的某个操作"。DataHub 还支持 SSO 集成,企业环境里这点很重要。
OpenMetadata 的权限模型是四款里最细的,它把权限拆成"资源 + 操作"的组合,可以精确控制到"某个用户能不能编辑某个表的描述"。OpenMetadata 还支持团队和角色的层级管理,适合组织架构复杂的公司。
Gravitino 的权限模型还在演进中,目前主要依赖底层数据源的权限,Gravitino 本身只做一层薄薄的封装。
提示:权限模型一定要在选型阶段就验证清楚。我见过一个团队上了 Atlas 半年后才发现不支持字段级权限,最后不得不迁移到 DataHub,迁移成本极高。
4.4 搜索体验:元数据平台的"最后一公里"
元数据平台好不好用,搜索体验占一半。元数据量大了之后,如果搜不到想要的东西,平台就废了。
Atlas 的搜索基于 Solr,支持基本的全文搜索和属性过滤。但 Atlas 的搜索 UI 比较简陋,不支持模糊匹配和智能推荐。
DataHub 的搜索基于 Elasticsearch,支持全文搜索、属性过滤、布尔查询。DataHub 的搜索体验不错,但有个坑:它的搜索默认只搜"名称"和"描述",不搜"字段名"。如果你想搜某个字段名,需要显式配置。
OpenMetadata 的搜索体验是四款里最好的。它支持全文搜索、模糊匹配、同义词扩展,还能按数据源、标签、所有者等维度过滤。OpenMetadata 的搜索还支持"最近浏览"和"推荐",用起来很顺手。
Gravitino 的搜索能力较弱,它主要提供 API 查询,UI 搜索功能有限。
5. 常见问题与排查技巧实录
5.1 Atlas 启动失败排查
Atlas 启动失败是最常见的问题,我整理了一个排查顺序:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 启动卡在 "Starting Atlas" | HBase 连接失败 | 检查atlas.graph.storage.hostname和 HBase 是否可达 |
| 启动报 OOM | 堆内存不足 | 调大ATLAS_OPTS里的-Xmx |
| Solr 索引创建失败 | SolrCloud 配置错误 | 检查atlas.graph.index.search.solr.zookeeper-url |
| Kafka 通知失败 | Kafka 不可达 | 检查atlas.kafka.bootstrap.servers |
| UI 打不开 | 端口冲突或服务未起 | 检查 21000 端口和 Atlas 进程 |
5.2 DataHub ingestion 失败排查
DataHub 的 ingestion 失败通常有几个原因:
第一,recipe 配置错误。DataHub 的 ingestion recipe 是 YAML 格式,缩进错误会导致解析失败。建议用datahub ingest -c recipe.yaml --dry-run先验证配置。
第二,数据源连接失败。检查数据源的连接信息,尤其是密码和网络可达性。DataHub 的 ingestion 是在容器里跑的,容器网络和宿主机网络可能不通。
第三,Schema 映射失败。如果数据源的表结构有特殊类型,DataHub 可能无法映射。这时候需要自定义 transformer。
5.3 OpenMetadata ingestion 的 Airflow 依赖问题
OpenMetadata 的 ingestion 依赖 Airflow,这是它最大的部署痛点。常见问题包括:
- Airflow 的 DAG 没有自动加载:检查
dags_folder配置和 DAG 文件权限 - ingestion 任务一直 pending:检查 Airflow 的 worker 是否正常
- ingestion 报权限错误:检查 Airflow 连接 OpenMetadata API 的 token 是否有效
我的建议是:如果团队没有 Airflow 运维经验,先用 OpenMetadata 的 API 方式接入元数据,等熟悉了再上 ingestion 框架。
5.4 Gravitino 的 Catalog 注册失败
Gravitino 注册 Catalog 时最常见的错误是版本不兼容。比如你用的 Iceberg 版本是 1.4.x,但 Gravitino 只支持到 1.3.x,注册就会失败。排查方法是看 Gravitino 的日志,它会明确告诉你版本不匹配。
另一个常见问题是权限。Gravitino 访问底层数据源需要相应的权限,比如访问 Hive Metastore 需要 Hive 的读权限,访问 S3 需要 S3 的访问密钥。这些权限要在 Catalog 的 properties 里配置。
6. 选型决策:不同场景下的最优解
6.1 按团队规模选
小团队(10 人以下):直接上 OpenMetadata。它的部署最简单,UI 最好用,开箱即用的功能最多。小团队没有精力折腾复杂的部署和配置,OpenMetadata 能让你在一天内看到效果。
中型团队(10-50 人):DataHub 或 OpenMetadata 都可以。如果团队有较强的工程能力,想要更灵活的扩展性,选 DataHub。如果更看重落地速度和协作体验,选 OpenMetadata。
大型团队(50 人以上):DataHub 更合适。它的事件驱动架构和读写分离设计,在元数据量大、并发高的场景下表现更好。如果团队有 Hadoop 历史包袱,Atlas 也可以考虑,但要评估社区活跃度和长期维护成本。
6.2 按数据架构选
传统 Hadoop 架构:Atlas 最原生,但建议评估迁移到 DataHub 或 OpenMetadata 的成本。
云原生 + 数据湖架构:Gravitino + OpenMetadata 的组合值得考虑。Gravitino 做元数据访问层,OpenMetadata 做元数据管理和协作。
混合架构(多种数据源):DataHub 的插件生态最丰富,接入各种数据源最方便。
6.3 按核心诉求选
血缘分析为主:Atlas 和 DataHub 的血缘能力最强,Atlas 的列级血缘更成熟,DataHub 的实时血缘更好。
元数据协作与治理为主:OpenMetadata 的协作体验最好,标签、术语表、数据契约这些功能做得最完善。
多源统一访问为主:Gravitino 是唯一选择,它的联邦式架构就是为这个场景设计的。
6.4 一个真实的选型案例
去年我帮一个电商团队做选型,他们的场景是:数据源有 Hive、MySQL、Kafka、Iceberg,团队 30 人,核心诉求是血缘分析和数据发现。
我们最终选了 DataHub。原因是:第一,DataHub 对 Kafka 和 Iceberg 的支持比 OpenMetadata 好;第二,DataHub 的 GraphQL API 方便和他们内部的数据门户集成;第三,团队有较强的工程能力,能 hold 住 DataHub 的运维复杂度。
上线后遇到的最大问题是 Elasticsearch 的性能。元数据量到 50 万之后,搜索开始变慢。我们通过调整分片数和增加 ES 节点解决了。这个案例说明,选型时一定要考虑元数据量的增长曲线。
7. 我个人的一些实操体会
用了这四款产品之后,有几个体会是文档里不会写的。
第一,元数据平台的成败不在技术,在运营。我见过太多团队花几个月部署了平台,结果没人用。元数据平台要有人运营,要定期清理无效元数据,要推动业务方补充描述和标签。技术选型只是第一步。
第二,不要追求"大而全"。一开始就想把所有数据源都接进来,结果每个都接得半吊子。建议先接核心数据源,把血缘和搜索跑通,再逐步扩展。
第三,API 比 UI 重要。元数据平台最终一定要和内部系统集成,API 的完备性和稳定性比 UI 好不好看重要得多。选型时一定要验证 API 的能力。
第四,社区活跃度是长期成本的关键。Atlas 的社区活跃度明显下滑,遇到问题很难找到答案。DataHub 和 OpenMetadata 的社区很活跃,GitHub issue 响应快。Gravitino 还年轻,但背靠 Apache 基金会,长期看有保障。
最后分享一个小技巧:不管选哪款,都建议先用 Docker 在本地跑一遍,把核心功能都试一遍,再决定是否上生产。本地跑一遍的成本很低,但能帮你避开很多坑。我在选型时通常会花两天时间把候选产品都部署一遍,做同样的操作,对比体验。这个投入是值得的。