Catalog 多了无法统一管理?Gravitino 一个入口统管 OSS Tables【详解 OSS Tables 系列】

简介: 本文介绍如何通过 Apache Gravitino 统一管理多源异构元数据(如 OSS Tables、Hive、JDBC 等),解决 Catalog 多、配置重复、元数据碎片化问题。Gravitino 作为元数据联邦层,提供统一命名空间与权限治理,并支持 Spark/Flink/Trino 等引擎通过单一 REST 接口跨源查询,显著降低运维与接入成本。

Catalog 多了,统一管理就成了新问题

前四篇分别演示了 Spark、Kafka Connect、Flink、Trino 接入 OSS Tables。四个引擎、四种配置写法,但连的是同一个东西:OSS Tables 对外暴露的那一个 Iceberg REST Catalog 端点。表、Schema、快照都在同一份元数据里,各引擎看到的命名空间完全一致,新建一张表也不需要去每个引擎那里确认一遍。换句话说,引擎数量增长本身并不会让元数据碎片化,这正是 REST Catalog 这套标准协议的价值所在。

真正的麻烦来自另一个维度:一家企业里的 Catalog 往往不止 OSS Tables 一个。存量的自建 Hive Metastore 还在跑,兄弟团队有自己的 Iceberg REST Catalog,业务侧有 MySQL、PostgreSQL 这类 JDBC 库表,还有大量非表形态的训练数据和日志文件集。它们是彼此独立的元数据源,各有各的命名空间、权限模型和接入方式。于是,当分析师想知道“公司里到底有哪些数据”,得跑好几个系统分别查,引擎要做跨源查询,得把这堆 Catalog 逐个配进来,再接入一个新引擎,这份配置还得重抄一遍——成本是“引擎数 × Catalog 数”。

Apache Gravitino 要解的就是这个乘法问题。作为生态里的元数据中枢,它是一个开源的统一元数据管理平台,定位是“数据湖的元数据联邦层”:把多个异构 Catalog 挂在同一个 Metalake 之下,不管底层是 Iceberg、Hive、JDBC 还是 Fileset,在 Gravitino 里都是一致的命名空间、统一的元数据视图和权限治理。

OSS Tables 兼容 Iceberg REST Catalog 协议,因此可以直接作为 Gravitino 的一个 Catalog Backend 挂载进来;而 Gravitino 自带的 Iceberg REST 服务又会把整个 Metalake 重新以标准 REST Catalog 协议暴露出去。最直接的效果是:Spark、Flink、Trino 只连 Gravitino 这一个入口,就能在同一份 SQL 里同时访问 OSS Tables 和 Hive、JDBC 上的存量数据,而端点、warehouse ARN、签名方式这些接入细节收敛到 Gravitino 一侧统一维护。

前提条件

  • 已部署 Apache Gravitino 服务。
  • 已创建 OSS Tables 的 Table Bucket。如未创建,请参见OSS Tables。
  • 已安装 Spark 3.5 及以上版本,用于通过 Gravitino 访问 OSS Tables 数据。

步骤一:配置环境变量

Gravitino Iceberg REST 服务和后续访问 OSS Tables 的 Spark 客户端均需要凭证。环境变量名使用 AWS_ 前缀,是因为底层 Iceberg SigV4 签名模块和 S3FileIO 复用 AWS SDK 标准凭证链;实际填入的是阿里云账号的凭证。

配置 Gravitino 服务环境变量

在启动 Gravitino Iceberg REST 服务前设置以下环境变量。配置后,创建 Catalog 时无需填写 rest.access-key-id 和 rest.secret-access-key。

export AWS_ACCESS_KEY_ID=<阿里云AccessKey ID>
export AWS_SECRET_ACCESS_KEY=<阿里云AccessKey Secret>
export AWS_REGION=<地域,例如cn-hangzhou>
# 可选,使用STS临时凭证时配置
export AWS_SESSION_TOKEN=<阿里云STS TOKEN>

配置 Spark 环境变量

在启动 Spark Driver 和 Executor 前设置以下环境变量。配置后,无需填写 spark.sql.catalog.oss_cata.s3.access-key-id 和 spark.sql.catalog.oss_cata.s3.secret-access-key。

export AWS_ACCESS_KEY_ID=<阿里云AccessKey ID>
export AWS_SECRET_ACCESS_KEY=<阿里云AccessKey Secret>
export AWS_REGION=<地域,例如cn-hangzhou>
# 可选,使用STS临时凭证时配置
export AWS_SESSION_TOKEN=<阿里云STS TOKEN>
export AWS_REQUEST_CHECKSUM_CALCULATION=WHEN_REQUIRED

说明:生产环境推荐使用环境变量或 STS 临时凭证,避免在配置文件中明文写入长期 AccessKey。分布式部署时,需确保 Gravitino 服务进程以及 Spark Driver、Executor 均能读取各自所需的环境变量。

步骤二:准备依赖包

由于目前 Iceberg 社区版本的 OSSFileIO 性能欠佳,建议客户端配置 S3 FileIO。为避免 Gravitino 返回的 io-impl 覆盖客户端设置,需要修改 Gravitino 源码:编辑 iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/CatalogWrapperForREST.java,删除 catalogPropertiesToClientKeys 中的 IcebergConstants.IO_IMPL 一行:

private static final Set<String> catalogPropertiesToClientKeys =
    ImmutableSet.of(
        // IcebergConstants.IO_IMPL,   // 删除这一行
        IcebergConstants.AWS_S3_REGION,
        IcebergConstants.ICEBERG_S3_ENDPOINT,
        IcebergConstants.ICEBERG_OSS_ENDPOINT,

此外,还需将以下依赖包部署到 Gravitino 的 libs 目录中:

依赖包

版本

用途

gravitino-iceberg-aws-bundle-xxx.jar

与 Gravitino 版本匹配

加载 S3 相关依赖。建议在 Gravitino 源码中执行 ./gradlew :bundles:iceberg-aws-bundle:shadowJar 打包获取。

步骤三:创建 OSS Tables 相关资源

在配置 Gravitino Catalog 前,需先准备好 OSS Tables 的 Table Bucket,并获取其接入端点信息。

创建 Table Bucket

若尚未创建 Table Bucket,可通过 ossutil 或 AWS CLI 创建,详细步骤请参见OSS Tables。创建完成后,Table Bucket 的 ARN 格式为 acs:osstables:{region}:{accountId}:bucket/{bucketName},该 ARN 将作为步骤三中 Gravitino Catalog 的 warehouse 参数值。

获取接入端点

OSS Tables 提供 Iceberg REST Catalog 端点,Gravitino 通过该端点连接并管理 OSS Tables 的表元数据;该端点将作为步骤三中 Gravitino Catalog 的 uri 参数值。端点格式如下:

说明:底层数据文件通过 S3FileIO 访问 OSS 数据面(OSS 端点格式为 https://oss-{region}-internal.aliyuncs.com(内网)或 https://oss-{region}.aliyuncs.com(外网))。该端点由 OSS Tables REST Catalog 返回并由客户端 S3FileIO 使用,无需在 Gravitino Catalog 中单独指定(相关依赖与源码调整见步骤一)。

步骤四:创建基于 OSS Tables 的 Gravitino REST Catalog

以下示例中,Metalake 名称均为 my_metalake,Gravitino Iceberg REST 服务绑定的也是该 Metalake。

配置 Gravitino Iceberg REST 服务

在 Gravitino 配置文件中配置 Iceberg REST Catalog 的 Metalake:

# ===== Iceberg REST Auxiliary Service =====
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
gravitino.iceberg-rest.catalog-config-provider = dynamic-config-provider
gravitino.iceberg-rest.gravitino-metalake = my_metalake

创建 Metalake

curl -X POST http://localhost:8090/api/metalakes \
  -H "Content-Type: application/json" \
  -d '{
        "name": "my_metalake",
        "comment": "Main metalake",
        "properties": {}
      }'

创建 Catalog

创建基于 OSS Tables 的 Catalog:

curl -X POST http://localhost:8090/api/metalakes/my_metalake/catalogs \
  -H "Content-Type: application/json" \
  -d '{
    "name": "osstables_catalog",
    "type": "RELATIONAL",
    "provider": "lakehouse-iceberg",
    "comment": "OSS Tables via Iceberg REST",
    "properties": {
      "catalog-backend": "custom",
      "catalog-backend-impl": "org.apache.iceberg.rest.RESTCatalog",
      "uri": "https://cn-hangzhou-internal.oss-tables.aliyuncs.com/iceberg",
      "warehouse": "acs:osstables:cn-hangzhou:{accountId}:bucket/your-table-bucket-name",
      "rest.auth.type": "sigv4",
      "rest.signing-region": "cn-hangzhou",
      "rest.signing-name": "osstables"
    }
  }'

说明:配置中的 AccessKey、Endpoint、Region 请根据实际情况修改。其中 uri 为 OSS Tables 的 Iceberg REST Catalog 端点,内网格式为 https://{region}-internal.oss-tables.aliyuncs.com/iceberg;warehouse 为 Table Bucket 的 ARN,格式为 acs:osstables:{region}:{accountId}:bucket/{bucketName}。

步骤五:通过 Gravitino 访问 OSS Tables

完成上述操作后,Gravitino 上已构建名为 osstables_catalog 的 Catalog。在 Spark 中配置以下参数,即可通过 Gravitino 访问 OSS Tables:

spark.sql.catalog.oss_cata=org.apache.iceberg.spark.SparkCatalog
spark.sql.catalog.oss_cata.type=rest
spark.sql.catalog.oss_cata.io-impl=org.apache.iceberg.aws.s3.S3FileIO
spark.sql.catalog.oss_cata.uri=http://127.0.0.1:9001/iceberg/
spark.sql.catalog.oss_cata.warehouse=osstables_catalog
spark.sql.catalog.oss_cata.s3.region=<地域,例如cn-hangzhou>
spark.sql.catalog.oss_cata.s3.endpoint=https://oss-{region}-internal.aliyuncs.com

说明:必须显式配置 spark.sql.catalog.oss_cata.io-impl=org.apache.iceberg.aws.s3.S3FileIO。由于步骤一已移除 Gravitino 对 io-impl 的透传,客户端需自行指定使用 S3FileIO,否则将回退到 HadoopFileIO 并因无法识别 oss:// 路径而报错。同时需将 s3.endpoint 指向 OSS 数据面端点,并在启动 Spark 前设置环境变量 AWS_REQUEST_CHECKSUM_CALCULATION=WHEN_REQUIRED(关闭 OSS 暂不支持的分块上传编码)。

配置完成后,即可使用标准 SQL 操作 OSS Tables 中的数据。以下示例中 Catalog 名称均为 oss_cata。

管理Namespace

Namespace(命名空间)用于对表进行逻辑分组,作用相当于数据库。

-- 查看现有Namespace
SHOW NAMESPACES IN oss_cata;
-- 创建Namespace
CREATE NAMESPACE oss_cata.my_namespace;
-- 删除Namespace(需先删除其中所有Table)
DROP NAMESPACE oss_cata.my_namespace;

建表与表管理

-- 创建非分区表
CREATE TABLE oss_cata.my_namespace.users (
    id BIGINT NOT NULL COMMENT '用户ID',
    name STRING COMMENT '用户名',
    email STRING COMMENT '邮箱',
    created_at TIMESTAMP COMMENT '创建时间'
) USING iceberg;
-- 创建分区表(按天分区)
CREATE TABLE oss_cata.my_namespace.events (
    id BIGINT NOT NULL,
    event_type STRING,
    data STRING,
    ts TIMESTAMP
) USING iceberg
PARTITIONED BY (days(ts));
-- 查看Namespace中的所有Table
SHOW TABLES IN oss_cata.my_namespace;
-- 查看表结构
DESCRIBE TABLE oss_cata.my_namespace.users;
-- 删除表(OSS Tables 要求必须带 PURGE 关键字,否则会报错:OSS Tables only supports dropping tables with purge enabled)
DROP TABLE oss_cata.my_namespace.users PURGE;

数据写入与查询

-- 插入数据
INSERT INTO oss_cata.my_namespace.users VALUES
    (1, '张三', 'zhangsan@example.com', TIMESTAMP '2024-01-15 10:30:00'),
    (2, '李四', 'lisi@example.com', TIMESTAMP '2024-01-16 14:20:00'),
    (3, '王五', 'wangwu@example.com', TIMESTAMP '2024-01-17 09:15:00');
-- 全表查询
SELECT * FROM oss_cata.my_namespace.users;
-- 条件查询
SELECT * FROM oss_cata.my_namespace.users WHERE id = 2;
-- 聚合查询
SELECT COUNT(*) AS total FROM oss_cata.my_namespace.users;
-- 分组聚合
SELECT name, COUNT(*) AS cnt FROM oss_cata.my_namespace.users GROUP BY name;
-- 更新数据
UPDATE oss_cata.my_namespace.users SET name = '赵六' WHERE id = 3;
-- 删除数据
DELETE FROM oss_cata.my_namespace.users WHERE id = 1;
-- 查询验证
SELECT * FROM oss_cata.my_namespace.users ORDER BY id;

分区表操作

-- 插入分区数据
INSERT INTO oss_cata.my_namespace.events VALUES
    (1, 'click', '{"page": "home"}', TIMESTAMP '2024-01-15 10:30:00'),
    (2, 'view', '{"page": "product"}', TIMESTAMP '2024-01-15 11:00:00'),
    (3, 'click', '{"page": "detail"}', TIMESTAMP '2024-01-16 09:00:00');
-- 分区裁剪查询(仅扫描匹配分区)
SELECT * FROM oss_cata.my_namespace.events
WHERE ts >= TIMESTAMP '2024-01-15 00:00:00'
  AND ts < TIMESTAMP '2024-01-16 00:00:00';
-- 聚合统计
SELECT event_type, COUNT(*) AS cnt
FROM oss_cata.my_namespace.events
GROUP BY event_type;

时间旅行查询

Iceberg 支持时间旅行(Time Travel)查询,可读取历史某个时间点的数据快照。

-- 查看快照历史
SELECT snapshot_id, committed_at, operation
FROM oss_cata.my_namespace.users.snapshots;
-- 基于快照ID查询历史数据
SELECT * FROM oss_cata.my_namespace.users
VERSION AS OF <snapshot_id>;
-- 查询指定时间点的数据
SELECT * FROM oss_cata.my_namespace.users
TIMESTAMP AS OF TIMESTAMP '2024-01-16 00:00:00';
-- 查看数据文件分布
SELECT * FROM oss_cata.my_namespace.users.files;
相关文章
|
2月前
|
存储 人工智能 监控
当文件系统的用户从人变成 Agent,AgenticFS 如何重新定义存储的服务方式
AI时代正从“模型焦虑”转向“存储焦虑”:Agent爆发式增长暴露传统NAS在规模、隔离与安全上的根本缺陷。AgenticFS应运而生,首创“每Agent独享AgenticSpace”架构,实现亿级空间统一管理、毫秒级挂载、零信任临时凭证与管控面水平扩展,成为阿里云Agent全栈中不可或缺的原生存储基座。(239字)
228 0
|
2月前
|
存储 人工智能 弹性计算
AgenticFS 重磅发布:专为 AI Agent 打造的全新文件存储
阿里云发布AgenticFS——全球首款Agent Native文件存储,专为AI Agent场景设计。单系统支持百万级AgenticSpace,提供目录级权限隔离、独立配额与性能QoS,峰值挂卸载达10万QPS,兼顾安全、弹性与超大规模扩展能力。(239字)
248 0
|
7天前
|
存储 人工智能 缓存
降低 AI 存储成本 69% 阿里云发布新一代全栈自研高性能存储 CPFS
9月22日云栖大会,阿里云发布新一代CPFS存储:吞吐达百TB/s、IOPS过亿,单文件系统扩容至100PiB,模型启动耗时降50%,算力利用率升30%,存储成本降69%;同步推出KVCacheStore加速引擎,提升缓存命中率20%以上。
127 0
|
5月前
|
存储 人工智能 自然语言处理
知识库接入还能这么玩?Tablestore 四种方式实战揭秘
本文详解 Tablestore 知识库服务 API 设计、四种接入方式、多维度评测结果及 PDS、ECS 等客户落地案例,助力企业快速集成高质量 RAG 能力。
1024 125
|
5月前
|
缓存 NoSQL 数据可视化
让知识在 Agent 间流动 —— 表格存储知识库 Skills 实践指南
Tablestore 知识库服务提供全托管 RAG 方案,支持 PDF/Word 等多格式自动解析与向量检索。通过 `tablestore-agent-cli` 命令行工具和 `Agent Skills`,可让 OpenClaw、Hermes 等不同 Agent 共享同一知识源,打破数据孤岛,实现跨平台、跨设备的统一知识管理与实时同步。
1322 116
|
6月前
|
存储 人工智能 弹性计算
揭秘千问 APP 千万级 AI 订单背后的记忆存储实践
2026年春节,千问 APP “春节请客计划” 9 小时破 1000 万单,依赖 Tablestore 构建的一站式记忆系统:支持短期/长期记忆统一管理、毫秒级读写、Serverless 弹性伸缩、多模态数据融合及原生向量检索,实现数十亿条记忆的高效存储与实时流转。
1364 118
|
3月前
|
存储 人工智能 自然语言处理
阿里云盘企业版 x Qoder 联合发布
阿里云盘企业版正式推出CDE Agent——由Qoder Cloud Agents驱动的内生智能体,打通AI与企业文件断层。支持语义检索、跨文件分析、自动成稿及安全审计,无缝集成Qoder网盘Skill,实现“搜索→操作”闭环,让网盘真正具备思考与办事能力。
345 0
|
3月前
|
存储 人工智能 自然语言处理
阿里云盘企业版 CDE Agent 正式发布!企业网盘会思考、能办事,存储即智能
阿里云盘企业版推出CDE Agent,依托Qoder Cloud Agent实现网盘内文件智能处理与内容生成。文件存入即成“可对话、可执行”的智能资产,支持多模态检索、跨格式分析、自动总结与安全分享,全程数据不出域、权限原生继承、操作全程审计,让网盘升级为安全合规的AI智能工作空间。
556 0
|
4月前
|
存储 人工智能 运维
3 人团队零推广获 1.2 万用户:Matrees 如何用 OSS 向量 Bucket 低成本构建 AI 创作平台
Matrees 是 Z 世代创作者的 AI 虚拟世界平台,3 人团队几乎零推广获取 1.2 万用户。依托阿里云 OSS Vector Bucket 实现全托管向量检索,成本降 90%,让创作者专注构建虚拟世界。
456 1
|
4月前
|
存储 数据采集 机器人
具身智能爆发背后,存储如何成为关键基础设施?
具身智能爆发式发展带来存储新挑战:多模态数据采集、仿真生成、清洗标注、分布式训练与低延迟推理各环节诉求迥异。阿里云以 OSS 统一底座(支持 QoS 管控、冷热分层、Vector Bucket 向量检索)+ CPFS 高性能训练引擎协同,构建全链路、高弹性、低成本存储方案。
748 0
具身智能爆发背后,存储如何成为关键基础设施?

热门文章

最新文章