01 · Apache Gravitino 概览
部署版本 1.3.0 docker
1. Gravitino 是什么
Apache Gravitino 是一个高性能、地理分布、联邦式的元数据湖(metadata lake) 。它直接管理来自不同数据源、不同类型、不同区域的元数据,并为数据与 AI 资产提供统一的元数据访问能力。
许多大厂都以根据其来建设统一元数据中心,统一管理多类型元数据,以来对其AI资产进行开发。
简单理解:Gravitino 是一个统一的元数据管理平面,把分散在各处的元数据(Hive Metastore、MySQL、PostgreSQL、Iceberg、Kafka、文件存储、模型等)收敛到一套 API / UI 下管理,并提供给 Trino、Spark、Flink、Daft 等引擎以及 AI 工具(MCP server)统一访问。
2. 核心概念
| 概念 | 说明 |
|---|---|
| Metalake | 顶层元数据容器,包含一组 Catalog。 |
| Catalog | 一类元数据源的分组,分为 relational / fileset / messaging / model 几种类型。 |
| Schema | Catalog 下的数据库/命名空间。 |
| Table / Fileset / Topic / Model | Schema 下的具体元数据对象。 |
| Tag / Policy / Job | 治理能力(标签、策略、自动化任务,如「清理长期未用表」)。 |
层级关系:Metalake → Catalog → Schema → 对象(Table/Fileset/Topic/Model)。
3. 1.2.1 支持的 Catalog
- 关系型(Relational) :Doris、Hudi、Hive、Iceberg、MySQL、Paimon、PostgreSQL、StarRocks、Lakehouse generic。
OceanBase、ClickHouse自 1.2.0 起移至catalogs-contrib,不在标准发行包与 Docker 镜像中 ,需自行构建gravitino-<version>-bin-all.tar.gz。
- 文件集(Fileset):基于 HCFS(Hadoop Compatible File System)的 Fileset catalog。
- 消息(Messaging):Kafka。
- 模型(Model):Model catalog(模型版本管理)。
4. 镜像与组件
Gravitino 在 Docker Hub(apache/gravitino* 命名空间)提供以下镜像:
| 镜像 | 用途 | 默认端口 |
|---|---|---|
apache/gravitino:1.2.1(或 :latest) |
主服务:Web UI + REST API + 内置 Iceberg REST 辅助服务 | 8090(Web/REST)、9001(Iceberg REST) |
apache/gravitino-iceberg-rest:1.2.1 |
独立 Iceberg REST 服务 | 9001 |
apache/gravitino-mcp-server:1.2.1 |
Gravitino MCP server(供 AI 工具管理元数据) | 8000 |
apache/gravitino-lance-rest:1.2.1 |
独立 Lance REST 服务 | 9102 |
开发/测试通常只需要 主服务镜像
apache/gravitino。其余按需。
JVM 内存 :通过环境变量 GRAVITINO_MEM 控制,默认 -Xms1024m -Xmx1024m -XX:MaxMetaspaceSize=512m。例如调大:-e GRAVITINO_MEM="-Xms4g -Xmx4g -XX:MaxMetaspaceSize=1g"。
5. 容器内关键路径
| 路径 | 说明 |
|---|---|
${GRAVITINO_HOME} = /opt/gravitino |
安装根目录 |
/opt/gravitino/conf/gravitino.conf |
主配置文件 |
/opt/gravitino/libs/ |
依赖库(放置 MySQL/PG 驱动 jar 的位置) |
/opt/gravitino/data/ |
数据目录(默认 H2 数据库文件在此) |
/opt/gravitino/logs/ |
日志目录 |
/opt/gravitino/scripts/mysql/、/scripts/postgresql/ |
后端建表脚本 schema-{version}-mysql.sql 等 |
路径以官方镜像为准;可在容器内
echo $GRAVITINO_HOME确认。
6. 运行依赖
- Java 17(官方 Docker 镜像已内置,二进制本地安装时需自行准备)。
- 支持平台:Linux、macOS;x86_64 与 ARM64。
- Kubernetes 部署 :K8s 1.29+ 、Helm 3+。
- 若使用 MySQL/PG 后端:相应数据库实例 + JDBC 驱动 jar(镜像不内置)。
7. 架构示意(部署视角)
┌───────────────────────────────┐
浏览器 / 引擎 ─────▶│ Apache Gravitino Server │
(Trino/Spark/ │ - Web UI & REST API :8090 │
Flink/MCP/curl) │ - Iceberg REST aux :9001 │
└───────────────┬───────────────┘
│ 读写元数据
┌────────────┴───────────────┐
▼ ▼
┌───────────────┐ ┌────────────────────┐
│ 元数据存储后端 │ │ 各类数据源(Catalog) │
│ H2 / MySQL / │ │ MySQL/PG/Hive/ │
│ PostgreSQL │ │ Iceberg/Kafka/... │
└───────────────┘ └────────────────────┘
- 元数据存储后端:Gravitino 把自身管理的元数据(metalake/catalog/schema/table 的定义、tag、policy 等)存在 H2/MySQL/PG 里。
- Catalog 数据源:是 Gravitino 要管理的「外部数据系统」,通过 catalog 连接器去读取它们的真实结构。
两者不要混淆:开发测试时,后端常用 H2(零配置)或 MySQL(持久化);catalog 数据源则按你要管理的系统接入。
02 · 部署方案对比与选型
本文把开发/测试场景下可用的四条路径放在一起对比,帮助你快速选定方案。
方案总览
| # | 方案 | 部署形态 | 后端存储 | 资源占用 | 适用场景 | 难度 |
|---|---|---|---|---|---|---|
| A | Docker 单容器(内置 H2) | 1 个容器 | H2(容器内,非持久) | 低(1C/2G) | 最快验证 Gravitino API/UI;临时试用 | ⭐ |
| B | docker-compose:Gravitino + MySQL | 2 个容器 | MySQL(持久化卷) | 低(2C/3G) | 本地长期开发/测试;元数据要持久化 | ⭐⭐ |
| C | Kubernetes + Helm | Deployment/Service | H2 或 MySQL/PG(PVC) | 中 | 已有 K8s;需要多副本/Ingress/统一运维 | ⭐⭐⭐ |
| D | 官方 Playground | ~10 个容器 | Gravitino + Hive + PG + ... | 高(2C/8G/25G) | 体验完整数据栈与跨源查询 demo | ⭐⭐ |
决策建议
- 只想看看 Gravitino 长什么样、跑通 REST/UI → 方案 A (一条
docker run)。 - 本地开发,希望重启后元数据不丢、贴近生产配置 → 方案 B (推荐,文件见
assets/docker-compose-gravitino-mysql.yml)。 - 团队/平台已以 K8s 为标准、需要副本与 Ingress → 方案 C。
- 要演示「跨数据源联邦查询」「Iceberg REST」「Ranger 鉴权」等完整故事 → 方案 D(Playground 一键拉起整套生态)。
选型决策树
是否只需快速验证 Gravitino 本身?
├─ 是 → Docker 单容器(方案 A,H2)
└─ 否
└─ 是否需要一整套数据栈(Hive/Trino/Spark)做端到端演示?
├─ 是 → 官方 Playground(方案 D)
└─ 否
└─ 是否已有 Kubernetes 集群且需要副本/Ingress?
├─ 是 → Helm Chart(方案 C)
└─ 否 → docker-compose + MySQL(方案 B,推荐)
各方案要点速览
方案 A · Docker 单容器
- 命令:
docker run --rm -d -p 8090:8090 -p 9001:9001 apache/gravitino:1.2.1 - 优点:零配置、秒级启动;H2 自动建表。
- 缺点:容器删除即丢数据;不适合多副本。
- 详见 03-deploy-docker.md。
方案 B · docker-compose + MySQL
- 文件:
assets/docker-compose-gravitino-mysql.yml - 优点:元数据持久化、贴近生产;一条
docker compose up拉起 Gravitino + MySQL。 - 关键点:需要挂载 MySQL JDBC 驱动 jar 与自定义
gravitino.conf,并提前用建表脚本初始化库。 - 详见 03-deploy-docker.md。
方案 C · Kubernetes + Helm
- 官方 Helm Chart(尚未发布到 Helm 仓库 ,需 clone
apache/gravitino仓库后用dev/charts)。 - 前置:K8s 1.29+、Helm 3+。
- 内置可选 MySQL/PostgreSQL 子 chart(基于 Bitnami),或对接已有数据库。
- 详见 04-deploy-kubernetes.md。
方案 D · 官方 Playground
- 仓库:https://github.com/apache/gravitino-playground
- 一键脚本即可拉起 Hive/HDFS/Trino/MySQL/PostgreSQL/Jupyter/Spark + Gravitino + Grafana。
- 资源:2 CPU / 8 GB RAM / 25 GB 磁盘。
- 详见 05-deploy-playground.md。
共性注意事项(无论哪种方案)
- 端口冲突:本地若已有 MySQL(3306)/PG(5432),注意 Playground/compose 已规避(用 13306/15432 等)。单容器只占用 8090/9001。
- ARM64(Apple Silicon):官方镜像支持 ARM64,可直接运行。
- 认证 :开发/测试默认
simple匿名认证,绝不可直接暴露到公网;如需对外,参考官方 Security 文档配置 OAuth/Kerberos + HTTPS。 - 后端选择:H2 适合快速验证;只要希望数据可持久、可备份、可升级,就应选 MySQL 或 PostgreSQL。
下面介绍实操 docker + mysql 后端部署方式
注意 Gravition Playground 模式的概念为包含了 ranger
hive 等其他组件,拥有完整的功能体验所需组件,如果已有大数据集群等环境只需要部署 Gravition 即可
03 · Docker 部署
参考:https://gravitino.apache.org/docs/1.2.1/docker-image-details
参考:https://gravitino.apache.org/docs/1.2.1/how-to-use-relational-backend-storage/
本章覆盖两种 Docker 部署方式:
- 方案 A:单容器(内置 H2,最快验证)
- 方案 B :docker-compose(Gravitino + MySQL,持久化开发/测试,推荐)
前置条件
- 已安装 Docker(macOS/Linux 均可,支持 x86_64 与 ARM64)。
- 方案 B 额外需要 Docker Compose(v2,即
docker compose子命令)。 - 不需要本机安装 Java 17(镜像已内置)。
方案 A · 单容器(内置 H2,5 分钟跑通)
A.1 拉起服务
bash
docker run --rm -d \
--name gravitino \
-p 8090:8090 \
-p 9001:9001 \
-e GRAVITINO_MEM="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=512m" \
apache/gravitino:1.2.1
8090:Web UI + REST API → 浏览器打开http://localhost:80909001:Iceberg REST 辅助服务- 元数据存储在内置 H2 ,数据在容器内 ,
--rm停止后即删除。
A.2 想保留 H2 数据(可选)
去掉 --rm 并挂载数据卷:
bash
docker run -d \
--name gravitino \
-p 8090:8090 \
-p 9001:9001 \
-v gravitino-data:/root/gravitino/data \
-v gravitino-logs:/root/gravitino/logs \
apache/gravitino:1.2.1
bash
docker start gravitino # 下次启动
docker logs -f gravitino # 查看日志
docker stop gravitino # 停止
docker rm gravitino # 删除(卷数据保留)
A.3 验证
bash
# 健康检查
curl http://localhost:8090/api/version
# 浏览器
open http://localhost:8090
看到版本号返回 / Web UI 能打开即部署成功。后续操作见 07-verify-and-quickstart.md。
方案 B · docker-compose(Gravitino + MySQL,推荐)
用 MySQL 作为元数据后端,元数据落盘持久化,重启不丢、贴近生产配置。本节给出完整、可复制的步骤:先列所需文件与来源,再逐项获取与配置。
B.0 部署所需的文件与来源(先看这张表)
方案 B 共需 4 个文件,来源分三类------本仓库 docs/assets/ 、官方镜像内 、Maven Central:
| # | 文件 | 作用 | 来源 | 获取方式 |
|---|---|---|---|---|
| 1 | docker-compose-gravitino-mysql.yml |
编排 Gravitino + MySQL 两个容器 | 本仓库 docs/assets/ |
cp(B.2-(1)) |
| 2 | gravitino.conf |
切到 MySQL 后端的完整配置 | 本仓库 docs/assets/gravitino-mysql.conf |
cp(B.2-(1)) |
| 3 | mysql-connector-j-8.x.jar |
MySQL JDBC 驱动(官方镜像不内置) | Maven Central | curl 下载(B.2-(2)) |
| 4 | schema-*-mysql.sql |
元数据建表脚本(首次初始化用) | 官方镜像内 /root/gravitino/scripts/mysql/ |
docker cp(B.2-(3)) |
为什么需要 3、4? 官方镜像默认用 H2(启动时自动建表)。一旦切到 MySQL:① 镜像不自带 MySQL 驱动 jar,必须自行放入
libs/;② MySQL 后端不会自动建表,必须手工执行一次schema-*-mysql.sql。这两点是方案 B 与方案 A 的唯一差别,也是最常见的踩坑点。
B.1 目标目录布局
所有文件按下面结构放在同一个 deploy/ 目录(路径可自定,但文件名需与 compose 挂载源保持一致):
deploy/
├── docker-compose-gravitino-mysql.yml
├── conf/
│ └── gravitino.conf
├── libs/
│ └── mysql-connector-j-8.0.33.jar
└── init/
└── 01-schema-mysql.sql
一键创建空目录骨架:
bash
mkdir -p deploy/{conf,libs,init}
cd deploy
B.2 逐项获取文件
(1) 复制 compose 与配置
docker-compose-gravitino-mysql.yml 文件
yml
# 方案 B:Gravitino + MySQL(元数据持久化后端),开发/测试推荐。
#
# 所需目录布局(与本文件放在同一目录):
# ./conf/gravitino.conf <- 由 assets/gravitino-mysql.conf 复制而来
# ./libs/mysql-connector-j-8.0.33.jar <- 你下载的 MySQL 8 驱动 jar(文件名按实际调整)
# ./init/01-schema-mysql.sql <- 从镜像取出的 scripts/mysql/schema-*-mysql.sql
# 准备步骤见 docs/03-deploy-docker.md 的 B.1~B.3。
#
# 用法:
# docker compose -f docker-compose-gravitino-mysql.yml up -d
# docker compose -f docker-compose-gravitino-mysql.yml logs -f gravitino
# 访问:http://localhost:8090 | MySQL:localhost:13306
name: gravitino-dev
services:
mysql:
image: mysql:8.0
container_name: gravitino-mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: gravitino
MYSQL_USER: gravitino
MYSQL_PASSWORD: gravitino
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --default-authentication-plugin=mysql_native_password
ports:
- "13306:3306"
volumes:
- mysql-data:/var/lib/mysql
- ./init:/docker-entrypoint-initdb.d:ro # 仅在数据卷为空(首次)时执行
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-uroot", "-proot"]
interval: 10s
timeout: 5s
retries: 12
start_period: 30s
restart: unless-stopped
gravitino:
image: apache/gravitino
container_name: gravitino
ports:
- "8090:8090"
- "9001:9001"
environment:
GRAVITINO_MEM: "-Xms1g -Xmx1g -XX:MaxMetaspaceSize=512m"
# 新版镜像(1.3.0+)启动时会用环境变量重写 gravitino.conf;本方案挂载了自定义
# 只读 conf,必须跳过重写,否则 os.remove 会撞 read-only 挂载报 "Device or resource busy"。
SKIP_CONFIG_REWRITE: "true"
volumes:
# 整体替换配置文件(含 MySQL 后端切换),见 gravitino-mysql.conf
- ./conf/gravitino.conf:/opt/gravitino/conf/gravitino.conf:ro
# 单独挂载驱动 jar(覆盖单个文件,不会影响镜像自带的其他 libs)
- ./libs/mysql-connector-j-8.0.33.jar:/opt/gravitino/libs/mysql-connector-j-8.0.33.jar:ro
- gravitino-data:/opt/gravitino/data
- gravitino-logs:/opt/gravitino/logs
depends_on:
mysql:
condition: service_healthy
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "curl -fsS http://localhost:8090/api/version || exit 1"]
interval: 15s
timeout: 5s
retries: 15
start_period: 60s
volumes:
mysql-data:
gravitino-data:
gravitino-logs:
gravitino.conf 文件
bash
# gravitino-mysql.conf
# 方案 B 用:把 Gravitino 元数据后端从默认 H2 切到 MySQL。
# 本文件为「可独立工作的完整配置」,基于官方默认值(dev/charts/gravitino/values.yaml)整理,
# 仅在「元数据存储后端」段落改用 MySQL。挂载后会整体替换镜像内的 /root/gravitino/conf/gravitino.conf。
#
# 用法:
# cp gravitino-mysql.conf ./conf/gravitino.conf # 放到 compose 同层的 conf/ 目录
# 请按实际修改 jdbcUrl / jdbcUser / jdbcPassword;compose 中 MySQL 服务名为 mysql。
# ----------------------------------------------------------------------------
# 元数据存储后端(MySQL)
# ----------------------------------------------------------------------------
gravitino.entity.store = relational
gravitino.entity.store.relational = JDBCBackend
gravitino.entity.store.relational.jdbcUrl = jdbc:mysql://mysql:3306/gravitino?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
gravitino.entity.store.relational.jdbcDriver = com.mysql.cj.jdbc.Driver
gravitino.entity.store.relational.jdbcUser = gravitino
gravitino.entity.store.relational.jdbcPassword = gravitino
# ----------------------------------------------------------------------------
# Web 服务
# ----------------------------------------------------------------------------
gravitino.server.shutdownTimeout = 3000
gravitino.webserver.host = 0.0.0.0
gravitino.webserver.httpPort = 8090
gravitino.webserver.minThreads = 24
gravitino.webserver.maxThreads = 200
gravitino.webserver.stopTimeout = 30000
gravitino.webserver.idleTimeout = 30000
gravitino.webserver.threadPoolWorkQueueSize = 100
gravitino.webserver.requestHeaderSize = 131072
gravitino.webserver.responseHeaderSize = 131072
# ----------------------------------------------------------------------------
# Catalog 缓存 & 实体缓存
# ----------------------------------------------------------------------------
gravitino.catalog.cacheEvictionIntervalMs = 3600000
gravitino.cache.enabled = true
gravitino.cache.maxEntries = 10000
gravitino.cache.expireTimeInMs = 3600000
gravitino.cache.enableStats = false
gravitino.cache.enableWeigher = true
gravitino.cache.implementation = caffeine
# ----------------------------------------------------------------------------
# Iceberg REST 辅助服务(:9001)
# ----------------------------------------------------------------------------
gravitino.auxService.names = iceberg-rest
gravitino.iceberg-rest.classpath = iceberg-rest-server/libs, iceberg-rest-server/conf
gravitino.iceberg-rest.host = 0.0.0.0
gravitino.iceberg-rest.httpPort = 9001
# 默认内存后端,仅适合单机演示;多副本或持久化建议改 hive / jdbc
gravitino.iceberg-rest.catalogBackend = memory
gravitino.iceberg-rest.warehouse = /tmp/
# ----------------------------------------------------------------------------
# 认证与授权(开发/测试默认匿名,切勿对外暴露)
# ----------------------------------------------------------------------------
gravitino.authenticators = simple
gravitino.authorization.enable = false
gravitino.authorization.serviceAdmins = anonymous
# ----------------------------------------------------------------------------
# 审计 & 指标(默认关闭)
# ----------------------------------------------------------------------------
gravitino.audit.enabled = false
gravitino.metrics.timeSlidingWindowSecs = 60
(2) 下载 MySQL JDBC 驱动(Maven Central)
bash
# mysql-connector-j 8.0.33(驱动类 com.mysql.cj.jdbc.Driver,适配 MySQL 8.0)
curl -L -o libs/mysql-connector-j-8.0.33.jar \
https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.33/mysql-connector-j-8.0.33.jar
- 文件名必须与 compose 中 gravitino 服务那行挂载源一致(默认
mysql-connector-j-8.0.33.jar);改版本就同步改 compose。- 驱动版本要与 MySQL 实例兼容:MySQL 8.0 用
mysql-connector-j 8.x;旧名mysql-connector-java已更名。- 没外网时也可从 Maven Central 搜索页 手动下载后放进
libs/。
(3) 从官方镜像取出建表脚本
bash
# 创建临时容器 → 拷出 scripts/mysql → 删除临时容器
# 使用最新版
docker create --name gtmp apache/gravitino
docker cp gtmp:/opt/gravitino/scripts/mysql ./mysql-scripts
docker rm gtmp
# 选版本号最大的脚本(脚本版本号与 Gravitino release 不完全一致,取最大即可)
ls -1 ./mysql-scripts
# 例:schema-0.8.0-mysql.sql schema-0.7.0-mysql.sql ...
cp ./mysql-scripts/schema-1.3.0-mysql.sql ./init/01-schema-mysql.sql # 按实际最大版本号调整
建表脚本会落到哪个库? compose 里 MySQL 设了
MYSQL_DATABASE: gravitino,官方mysql镜像会在首次初始化 时自动建gravitino库,并在该库上下文下执行init/*.sql,所以脚本里的CREATE TABLE直接落到gravitino库。无需 手工CREATE DATABASE。例外:若脚本开头出现
USE <其它库名>;,请改成USE gravitino;。升级场景用
upgrade-{old}-to-{new}-mysql.sql,不在此流程内。
(4) 核对配置(conf 与 compose 是否对齐)
打开 conf/gravitino.conf,确认元数据后端三要素指向 compose 里的 MySQL 服务:
properties
# 服务名 mysql = compose 中 MySQL 容器名;库名 gravitino = MYSQL_DATABASE
gravitino.entity.store = relational
gravitino.entity.store.relational = JDBCBackend
gravitino.entity.store.relational.jdbcUrl = jdbc:mysql://mysql:3306/gravitino?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
gravitino.entity.store.relational.jdbcDriver = com.mysql.cj.jdbc.Driver
gravitino.entity.store.relational.jdbcUser = gravitino
gravitino.entity.store.relational.jdbcPassword = gravitino
mysql是 compose 里 MySQL 服务的容器名 (容器间互访用,不是localhost)。jdbcUser / jdbcPassword必须与 compose 里 MySQL 的MYSQL_USER / MYSQL_PASSWORD一致(默认都是gravitino);改密码时两处同步改。gravitino-mysql.conf其余段落(Web 端口、Iceberg REST、认证授权、缓存)均为官方默认值,开发/测试无需改动;逐项含义见 06-configuration-reference.md。
B.3 理解 compose 文件(逐段,便于按需改)
完整文件见 docs/assets/docker-compose-gravitino-mysql.yml,关键点拆解:
MySQL 服务
yaml
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: gravitino # 自动建库 + init 脚本在此库执行
MYSQL_USER: gravitino # 业务账号(与 conf 的 jdbcUser 对应)
MYSQL_PASSWORD: gravitino
command: # 字符集 + 兼容旧认证插件
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --default-authentication-plugin=mysql_native_password
ports: ["13306:3306"] # 宿主机 13306 → 容器 3306,避免与本机 MySQL 冲突
volumes:
- mysql-data:/var/lib/mysql
- ./init:/docker-entrypoint-initdb.d:ro # 仅在卷为空(首次)时执行
healthcheck: ... # mysqladmin ping,供 Gravitino 等待就绪
Gravitino 服务
yaml
gravitino:
image: apache/gravitino:1.2.1
ports: ["8090:8090", "9001:9001"]
environment:
GRAVITINO_MEM: "-Xms1g -Xmx1g -XX:MaxMetaspaceSize=512m" # JVM 堆,按需调
volumes:
- ./conf/gravitino.conf:/opt/gravitino/conf/gravitino.conf:ro # 整体替换配置
- ./libs/mysql-connector-j-8.0.33.jar:/opt/gravitino/libs/mysql-connector-j-8.0.33.jar:ro # 单文件挂驱动
- gravitino-data:/opt/gravitino/data
- gravitino-logs:/opt/gravitino/logs
depends_on:
mysql: { condition: service_healthy } # 等 MySQL 健康后再启动
单文件挂载驱动 jar (而非挂整个
libs/目录)不会覆盖镜像自带的其他依赖。若该方式在你的版本下未被 classpath 加载,改用自定义镜像:
dockerfileFROM apache/gravitino:1.2.1 COPY mysql-connector-j-8.0.33.jar /opt/gravitino/libs/
B.4 启动与验证
bash
docker compose -f docker-compose-gravitino-mysql.yml up -d
docker compose -f docker-compose-gravitino-mysql.yml logs -f gravitino

看到 Gravitino Server started(或 Web UI 可访问)即成功。验证:http://localhost:8090/ui/metalakes

到此 完成 docker + mysql 方式安装,下一步进行 已有Hive数据导入及spark集成查询。