Apache Gravitino 新一代元数据开源框架解析及Docker部署操作手册

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。
    • OceanBaseClickHouse 自 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

方案 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

共性注意事项(无论哪种方案)

  1. 端口冲突:本地若已有 MySQL(3306)/PG(5432),注意 Playground/compose 已规避(用 13306/15432 等)。单容器只占用 8090/9001。
  2. ARM64(Apple Silicon):官方镜像支持 ARM64,可直接运行。
  3. 认证 :开发/测试默认 simple 匿名认证,绝不可直接暴露到公网;如需对外,参考官方 Security 文档配置 OAuth/Kerberos + HTTPS。
  4. 后端选择: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:8090
  • 9001: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 加载,改用自定义镜像:

dockerfile 复制代码
FROM 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集成查询。