使用 Apache Gravitino 与 Trino 实现联邦查询
作者:yuhui
最后更新:2026-02-11
概述
在本教程中,您将学习如何集成 Apache Gravitino 与 Trino,通过统一的元数据层实现跨多个数据源的查询联邦。完成本指南后,您将能够配置 Trino 自动加载 Gravitino 管理的 catalog,并无缝运行跨 catalog 查询。
您将完成的任务:
- 连接 Trino 到 Gravitino,实现自动加载 Gravitino 管理的 catalog
- 从 Trino SQL 创建 catalog,包括 Iceberg 和 MySQL 示例
- 执行联邦查询,跨异构数据源进行数据关联
- 验证 catalog 发现,使用 Trino SQL 检查 catalog
Trino 是一个分布式 SQL 查询引擎,专为针对任意规模数据的快速分析查询而设计。在现代数据架构中,组织经常需要跨多个异构系统(如 MySQL、PostgreSQL、Iceberg、Hive)查询数据,而无需移动或复制数据。这就是查询联邦变得至关重要的地方。
Apache Gravitino 通过充当统一的元数据控制台来简化这一过程。通过使用 Gravitino Trino Connector,您可以通过 Trino 中的单一 catalog 接口访问多个数据源,实现自动 catalog 发现和集中式元数据管理。
主要优势:
- 统一的 catalog 访问:通过单一接口查询 MySQL、Iceberg、Hive 和其他数据源
- 自动 catalog 发现:在 Gravitino 中创建的 catalog 自动在 Trino 中可用
- 零数据移动:跨异构系统进行关联而无需复制数据
- 集中式管理:在一个地方创建和更新 catalog,处处生效
架构概览:
[Gravitino Trino 查询联邦架构]
前置条件
开始本教程之前,您需要:
系统要求:
- Linux 或 macOS 操作系统,具有外网访问权限以进行下载
- 已安装并正确配置 JDK 17 或更高版本
必需组件:
- 已安装并运行的 Gravitino 服务器(参见
02-setup-guide/README.md) - Trino 服务器(coordinator + workers,或用于测试的单节点)
- Trino 版本 435 或与您的 Gravitino Trino connector 发布版本兼容的版本
可选组件:
- MySQL 或 PostgreSQL,用于 JDBC 联邦示例
- Hive Metastore,用于 Iceberg catalog 后端
- 对象存储(S3/GCS/Azure),用于基于云的 table 存储
继续之前,请验证您的 Java 版本:
${JAVA_HOME}/bin/java -version重要提示:确保您的 Gravitino 服务器配置为使用 simple 认证模式。Gravitino Trino connector 当前以匿名用户身份连接,不传递用户认证信息。设置
集成工作原理
Gravitino Trino Connector 使 Trino 能够从 Gravitino 动态加载 catalog:
- 该 connector 通过
etc/catalog/gravitino.properties配置为名为gravitino的 Trino catalog - 您可以通过 Gravitino 存储过程或 REST API 创建额外的 catalog(如
iceberg_test和mysql_test) - Trino 每 10 秒自动同步 Gravitino 管理的 catalog(可通过
gravitino.metadata.refresh-interval-seconds配置) - 您使用标准的
catalog.schema.table三段式命名方式查询联邦数据
本教程中使用的属性值
根据您的环境设置替换这些值:
- Gravitino URI:
http://gravitino-server:8090 - Metalake:
trino_metalake - Iceberg HMS URI:
thrift://hive-host:9083 - Iceberg warehouse:
hdfs://namenode:9000/user/iceberg/warehouse - MySQL JDBC URL:
jdbc:mysql://mysql-host:3306?useSSL=false - MySQL 凭据:
trino/ds123
步骤 1:安装和配置 Gravitino Trino Connector
Gravitino Trino Connector 必须安装在所有 Trino 节点(coordinator 和 workers)上。
安装 Gravitino Trino Connector 插件
1. 下载 connector
从 Apache Gravitino 下载页面 下载 Gravitino Trino connector 或从源代码构建。
2. 在所有 Trino 节点上安装 Gravitino connector
解压 Gravitino Trino connector 并将其复制到 Trino 的插件目录:
# 解压 connector
tar -xzf gravitino-trino-connector-<version>.tar.gz
# 复制到 Trino 插件目录(在 coordinator 和所有 workers 上)
cp -r gravitino-trino-connector-<version> ${TRINO_HOME}/plugin/gravitino[Gravitino Trino Connector 插件目录]
启用动态 Catalog 管理
配置 Trino 以支持动态 catalog
在 coordinator 上编辑 ${TRINO_HOME}/etc/config.properties:
catalog.management=dynamic配置 Gravitino Catalog
创建 etc/catalog/gravitino.properties
在每个 Trino 节点上创建 catalog 配置文件:
connector.name=gravitino
gravitino.uri=http://gravitino-server:8090
gravitino.metalake=trino_metalake注意:
gravitino.metalake中指定的 metalake 必须已在 Gravitino 中存在。如果不存在,请通过 Web UI 或 REST API 创建它:curl -X POST -H "Content-Type: application/json" \ -d '{"name":"trino_metalake","comment":"用于 Trino 联邦的 Metalake","properties":{}}' \ http://gravitino-server:8090/api/metalakes
重启 Trino
创建配置文件后,重启 Trino 以加载 connector。
验证安装
检查 gravitino catalog 是否已加载
SHOW CATALOGS;您应该在 catalog 列表中看到 gravitino,确认安装成功。
步骤 2:从 Trino SQL 创建 Catalog
配置好 gravitino catalog 后,使用 gravitino.system 中的存储过程创建额外的 catalog。
创建 Iceberg Catalog
使用 Hive Metastore 后端的示例
CALL gravitino.system.create_catalog(
'iceberg_test',
'lakehouse-iceberg',
MAP(
ARRAY['uri', 'catalog-backend', 'warehouse'],
ARRAY['thrift://hive-host:9083', 'hive', 'hdfs://namenode:9000/user/iceberg/warehouse']
)
);注意:对于 S3 或其他云存储,您可能需要使用 trino.bypass. 前缀传递额外的属性以设置 Trino 特定的配置。创建 MySQL Catalog
MySQL 的 JDBC catalog 示例
CALL gravitino.system.create_catalog(
'mysql_test',
'jdbc-mysql',
MAP(
ARRAY['jdbc-url', 'jdbc-user', 'jdbc-password', 'jdbc-driver'],
ARRAY['jdbc:mysql://mysql-host:3306?useSSL=false', 'trino', 'ds123', 'com.mysql.cj.jdbc.Driver']
)
);提示:要忽略"已存在"错误,请使用命名参数并设置 ignore_exist => true。验证 Catalog 创建
检查 Gravitino catalog
SELECT * FROM gravitino.system.catalog;预期输出:
name | provider | properties
--------------+-------------------+-------------------------------
iceberg_test | lakehouse-iceberg | {...}
mysql_test | jdbc-mysql | {...}步骤 3:验证 Catalog 发现
在 Gravitino 中创建 catalog 后,验证它们在 Trino 中是否可见。
确认 Catalog 可见性
检查可用的 catalog 和 schema
SHOW CATALOGS;
SHOW SCHEMAS FROM iceberg_test;
SHOW SCHEMAS FROM mysql_test;注意:Trino 每隔几秒从 Gravitino 同步 catalog。如果 catalog 没有立即出现,请稍等片刻后重试。
步骤 4:准备示例数据
创建示例 schema 和 table 以演示联邦功能。
创建 MySQL 维度表
设置用户维度表
-- 创建 schema
CREATE SCHEMA mysql_test.demo;
-- 创建 users table
CREATE TABLE mysql_test.demo.users (
user_id BIGINT,
user_name VARCHAR
);
-- 插入示例数据
INSERT INTO mysql_test.demo.users VALUES
(1, 'alice'),
(2, 'bob');
-- 验证数据
SHOW TABLES FROM mysql_test.demo;
SELECT * FROM mysql_test.demo.users;创建 Iceberg 事实表
设置事件事实表
-- 创建 schema
CREATE SCHEMA iceberg_test.demo;
-- 创建 events table
CREATE TABLE iceberg_test.demo.events (
user_id BIGINT,
event_type VARCHAR,
ts TIMESTAMP
);
-- 插入示例数据
INSERT INTO iceberg_test.demo.events VALUES
(1, 'click', TIMESTAMP '2024-01-01 10:00:00'),
(2, 'view', TIMESTAMP '2024-01-01 10:01:00');
-- 验证数据
SHOW TABLES FROM iceberg_test.demo;
SELECT * FROM iceberg_test.demo.events;步骤 5:执行联邦查询
这些示例展示了查询联邦的核心价值:在单个查询中跨异构数据源关联数据。
模式 1:跨 Catalog JOIN
关联维度表和事实表
SELECT
e.user_id,
u.user_name,
e.event_type,
e.ts
FROM iceberg_test.demo.events e
JOIN mysql_test.demo.users u
ON e.user_id = u.user_id
ORDER BY e.ts;模式 2:跨 Catalog 聚合
按用户统计事件数
SELECT
u.user_name,
COUNT(*) AS event_cnt
FROM iceberg_test.demo.events e
JOIN mysql_test.demo.users u
ON e.user_id = u.user_id
WHERE e.ts >= TIMESTAMP '2024-01-01 00:00:00'
GROUP BY u.user_name
ORDER BY event_cnt DESC, u.user_name;模式 3:半连接过滤
通过维度表成员资格过滤事实表
SELECT e.*
FROM iceberg_test.demo.events e
WHERE EXISTS (
SELECT 1
FROM mysql_test.demo.users u
WHERE u.user_id = e.user_id
);模式 4:LEFT JOIN 保留未匹配行
保留所有事件,即使没有匹配的用户
SELECT
e.user_id,
COALESCE(u.user_name, 'unknown') AS user_name,
e.event_type,
e.ts
FROM iceberg_test.demo.events e
LEFT JOIN mysql_test.demo.users u
ON e.user_id = u.user_id
ORDER BY e.ts;步骤 6:理解联邦机制
在联邦查询中,理解工作在哪里执行对于优化至关重要:
查询如何执行:
- Connector 级别读取:每个 connector(Iceberg、MySQL)从各自的数据源读取
- Trino 级别关联:Trino 在内存中组合来自多个数据源的结果
- 下推优化:某些过滤器和谓词可能会被下推到源系统
查询优化技巧:
- 提前过滤:在大表上应用分区/时间过滤器以减少扫描的数据量
- 对齐关联键:跨数据源使用一致的数据类型(例如,ID 使用
BIGINT) - 小维度模式:将大事实表与小维度表关联以提高效率
- 查看查询计划:使用
EXPLAIN了解执行策略
分析查询执行
EXPLAIN
SELECT
u.user_name,
COUNT(*) AS event_cnt
FROM iceberg_test.demo.events e
JOIN mysql_test.demo.users u
ON e.user_id = u.user_id
GROUP BY u.user_name;步骤 7:清理资源
删除示例数据和 catalog
-- 删除 table
DROP TABLE mysql_test.demo.users;
DROP TABLE iceberg_test.demo.events;
-- 删除 schema
DROP SCHEMA mysql_test.demo;
DROP SCHEMA iceberg_test.demo;
-- 删除 catalog
CALL gravitino.system.drop_catalog('mysql_test');
CALL gravitino.system.drop_catalog('iceberg_test');故障排除
常见问题及其解决方案:
Connector 安装问题:
- 找不到 Catalog:确保 Gravitino connector 插件已安装在所有 Trino 节点上,并且
gravitino.properties存在于etc/catalog/中 - 动态 catalog 不工作:验证在 coordinator 的
etc/config.properties中设置了catalog.management=dynamic
连接问题:
- 无法连接到 Gravitino:检查 Gravitino 服务器是否正在运行,以及
gravitino.uri是否正确 - 找不到 Metalake:确保
gravitino.metalake中指定的 metalake 在 Gravitino 中存在
Catalog 同步问题:
- Catalog 未出现:等待同步间隔(默认 10 秒)或调整
gravitino.metadata.refresh-interval-seconds - Catalog 信息过时:重启 Trino 或等待下一个同步周期
查询执行问题:
- 找不到 Table:验证完全限定的 table 名称格式:
catalog.schema.table - 权限被拒绝:检查 Gravitino 用户是否对底层数据源具有适当的权限
恭喜
您已成功完成 Gravitino Trino 查询联邦教程!
您现在拥有一个功能完整的 Trino 环境,集成了 Gravitino,包括:
- 配置了 Gravitino Trino Connector 以实现自动 catalog 发现
- 多个注册的 catalog(Iceberg 和 MySQL)可从 Trino 访问
- 可工作的联邦查询,跨异构数据源关联数据
- 理解查询优化模式和联邦机制
您的 Trino 环境现在已准备好利用 Gravitino 进行统一的元数据管理和跨系统查询联邦。
延伸阅读
有关更高级的配置和详细文档:
- 查看 Gravitino Trino Connector 文档 了解高级配置选项
- 了解 Trino 查询联邦 以获得更深入的理解
- 探索 Trino 性能调优 了解优化策略
下一步
- 探索使用 Gravitino 与 Flink 进行流式数据处理
- 关注并 star Apache Gravitino 仓库
Apache Gravitino 正在快速发展,本文基于最新版本 1.1.0 编写。如果您遇到问题,请参考官方文档或在 GitHub 上提交问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。