头图

使用 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-query-federation-architecture.png[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_testmysql_test
  • Trino 每 10 秒自动同步 Gravitino 管理的 catalog(可通过 gravitino.metadata.refresh-interval-seconds 配置)
  • 您使用标准的 catalog.schema.table 三段式命名方式查询联邦数据

本教程中使用的属性值

根据您的环境设置替换这些值:

  • Gravitino URIhttp://gravitino-server:8090
  • Metalaketrino_metalake
  • Iceberg HMS URIthrift://hive-host:9083
  • Iceberg warehousehdfs://namenode:9000/user/iceberg/warehouse
  • MySQL JDBC URLjdbc: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

trino_plugin_directory.png[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 进行统一的元数据管理和跨系统查询联邦。

延伸阅读

有关更高级的配置和详细文档:

下一步


Apache Gravitino 正在快速发展,本文基于最新版本 1.1.0 编写。如果您遇到问题,请参考官方文档或在 GitHub 上提交问题。


ApacheGravitino
0 声望1 粉丝

Apache Gravitino 是一个高性能、地理分布式且联合的元数据湖。通过采用技术数据目录和元数据湖,您能够管理所有数据源(包括文件存储、关系型数据库和事件流)的访问权限并实施数据治理,同时安全地在不同云服务...