Apache Iceberg REST Catalog 介绍(包含独立服务搭建、StarRocks 元数据管理和 MinIO 存储)

Apache Iceberg 是一个开源的表格式,用于大规模数据湖,提供 ACID 事务、模式演化、时间旅行等功能。REST Catalog 是 Iceberg 的一个关键组件,它通过 RESTful API 暴露目录操作(如表创建、更新、查询),允许不同引擎(如 Spark、Trino)统一访问元数据。 在本介绍中,我们重点讨论将 REST Catalog 作为独立服务部署,使用 StarRocks 管理 Iceberg 元数据,以及 MinIO 作为顶层对象存储的架构。这种 setup 适用于构建高性能、分布式的数据湖house,支持多引擎协作和高效元数据检索。

1. 架构概述

  • REST Catalog 作为独立服务REST Catalog 不存储数据本身,而是作为一个接口层,连接后端元数据存储(如数据库)和底层对象存储(如 MinIO)。它可以部署为独立的 HTTP 服务,支持 OpenAPI 规范,便于客户端集成。
  • StarRocks 管理 Iceberg 元数据 :StarRocks 是一个高性能 OLAP 数据库,支持作为 Iceberg 的 JDBC Catalog 后端存储元数据(如表模式、快照、分区)。这利用 StarRocks 的并行处理和缓存机制加速元数据检索。 StarRocks 还支持 Iceberg 的时间旅行、分支和标签管理。
  • MinIO 作为顶层存储:MinIO 是一个 S3 兼容的对象存储系统,用于存储 Iceberg 表的实际数据文件(Parquet、ORC 等)。它提供高性能、可扩展的存储,支持多租户和版本控制,与 Iceberg 的数据湖集成无缝。

这种组合的优势包括:跨引擎互操作性(通过 REST)、高效元数据管理(StarRocks 的 OLAP 能力)和成本有效的存储(MinIO 的开源性)。

2. 如何搭建 REST Catalog 作为独立服务

REST Catalog 可以基于Apache Gravitino或自定义实现部署为独立服务。 以下是使用 Docker 和 Gravitino 的典型搭建步骤(假设您有基本的 Docker 和 Java 环境):

  1. 准备环境
    • 安装 Docker 和 Docker Compose。
    • 下载 Gravitino(Iceberg REST server 支持版),从 Apache 官网或 GitHub 获取最新版本(v1.0.0+)。
    • 配置 catalog-config-provider 以支持 JDBC 后端(指向 StarRocks)。
  2. 部署 MinIO 作为对象存储
    • 使用 Docker 运行 MinIO:

      复制代码
      docker run -d -p 9000:9000 -p 9001:9001 --name minio \
        -e "MINIO_ROOT_USER=admin" -e "MINIO_ROOT_PASSWORD=admin123" \
        minio/minio server /data --console-address ":9001"
    • 创建桶(bucket)用于 Iceberg 数据,例如 iceberg-data。

    • 配置 S3 访问:MinIO 的 endpoint 为 http://localhost:9000,access key 和 secret key 如上。

  3. 设置 StarRocks 作为元数据管理
    • 部署 StarRocks(使用 Docker 或官方安装包)。例如 Docker 方式:

      复制代码
      docker run -d -p 9030:9030 -p 8040:8040 --name starrocks starrocks/allin1-ubuntu:latest
    • 在 StarRocks 中创建数据库和表用于 Iceberg 元数据(Iceberg JDBC Catalog 需要一个兼容 MySQL 的数据库)。StarRocks 兼容 MySQL 协议,可作为 JDBC 后端。

    • 配置 Iceberg JDBC Catalog:在 Gravitino 配置中设置 catalog-backend=jdbc,并指定 StarRocks 的 JDBC URL(如 jdbc:mysql://localhost:9030/iceberg_db?user=root&password=...)。

    • StarRocks 支持 Iceberg 元数据表查询(如 snapshots、manifests),启用时间旅行等功能。

  4. 部署 REST Catalog 服务
    • 使用 Gravitino 启动 REST server:

      • 编辑 conf/gravitino.conf 配置后端:

        复制代码
        gravitino.server.port=8090
        catalog.iceberg.type=iceberg
        catalog.iceberg.uri=http://localhost:8090  # 自引用或外部
        catalog.iceberg.catalog-backend=jdbc
        catalog.iceberg.jdbc.uri=jdbc:mysql://starrocks-host:9030/iceberg_db
        catalog.iceberg.warehouse=s3://iceberg-data/  # 指向 MinIO bucket
        catalog.iceberg.s3.endpoint=http://minio-host:9000
        catalog.iceberg.s3.access-key=admin
        catalog.iceberg.s3.secret-key=admin123
      • 运行:

        复制代码
        ./bin/gravitino.sh start
    • 或者,使用 Datastrato 或自定义 Java 实现:从 GitHub clone Iceberg 项目,构建 REST module,并用 Spring Boot 或类似框架部署为服务。

    • 测试:使用 curl 发送 REST 请求,例如 curl -X GET http://localhost:8090/v1/namespaces 检查命名空间。

  5. 集成与测试
    • 在 Spark 或其他引擎中配置 catalog 类型为 rest,URI 指向您的 REST 服务(如 spark.sql.catalog.my_catalog.uri=http://localhost:8090)。
    • 创建 Iceberg 表:数据文件存储在 MinIO,元数据在 StarRocks。
    • 在 StarRocks 中创建 external catalog 指向 Iceberg REST,以查询数据:CREATE EXTERNAL CATALOG iceberg_catalog PROPERTIES ("type"="iceberg", "iceberg.catalog.type"="rest", "uri"="http://localhost:8090");。

3. REST Catalog访问 Iceberg 表示例

3.1 通用 REST Catalog

在 Flink SQL 客户端中执行以下语句:

复制代码
-- 创建 REST Catalog
CREATE CATALOG rest_catalog WITH (
  'type' = 'iceberg',
  'catalog-impl' = 'org.apache.iceberg.rest.RESTCatalog',
  'uri' = 'http://localhost:8090',  -- 您的 REST 服务 URI
  'warehouse' = 's3://iceberg-data/',  -- MinIO bucket
  's3.endpoint' = 'http://minio-host:9000',
  's3.access-key-id' = 'admin',
  's3.secret-access-key' = 'admin123',
  's3.path-style-access' = 'true'
);


-- 切换到该 Catalog
USE CATALOG rest_catalog;

-- 创建一个 Iceberg 表(假设命名空间为 default)
CREATE TABLE IF NOT EXISTS default.sample_table (
  id BIGINT,
  name STRING,
  age INT
) WITH (
  'format-version' = '2'  -- Iceberg V2 格式,支持删除等
);

-- 插入数据
INSERT INTO default.sample_table VALUES (1, 'Alice', 30), (2, 'Bob', 25);

-- 查询数据
SELECT * FROM default.sample_table;

-- 时间旅行查询(Iceberg 特性,查询特定快照)
SELECT * FROM default.sample_table VERSION AS OF 1234567890;  -- 替换为实际快照 ID

3.2 Gravitino 作为 REST Catalog

sql 复制代码
-- 创建 Gravitino Catalog(它内部使用 REST)
CREATE CATALOG gravitino_catalog WITH (
  'type' = 'gravitino',
  'uri' = 'http://localhost:8090',  -- Gravitino 服务 URI
  'catalog' = 'iceberg_catalog'  -- Gravitino 中的 Iceberg Catalog 名称
);

-- 切换 Catalog
USE CATALOG gravitino_catalog;

-- 创建 Iceberg 表(元数据存储在 StarRocks/PostgreSQL)
CREATE TABLE sample_table (
  id BIGINT,
  data STRING
) WITH (
  'write.format.default' = 'parquet'  -- 数据格式
);

-- 插入和查询同上
INSERT INTO sample_table VALUES (1, 'Test Data');
SELECT * FROM sample_table;

4. 注意事项

  • 安全性:配置 JWT 或 OAuth 以保护 REST API,尤其在生产环境中。
  • 性能优化:利用 StarRocks 的缓存加速元数据加载,MinIO 的多节点部署提升存储吞吐。
  • 扩展:对于生产级,可用 Kubernetes 部署所有组件,支持多租户。
相关推荐
getapi3 小时前
/usr/local/apache-tomcat-9.0.71/logs/catalina.out占用了118G
tomcat·apache·firefox
weixin_440730503 小时前
Nginx、Apache和tomcat的简单了解。
nginx·tomcat·apache
天空属于哈夫克33 小时前
企业微信二次开发:如何实现外部群消息主动推送
apache·企业微信
石像鬼₧魂石4 小时前
Fail2ban + Nginx/Apache 防 Web 暴力破解配置清单
前端·nginx·apache
SelectDB15 小时前
Doris Catalog 已上线!性能提升 200x,全面优于 JDBC Catalog,跨集群查询迈入高性能分析时代
数据库·数据分析·apache
采云 AI1 天前
小程序订单接单超时时间功能解释
服务器·小程序·apache
半壶清水1 天前
ubuntu中使用使用Docker-Compose管理MySQL、Apache、PHP容器
mysql·ubuntu·docker·php·apache
SelectDB技术团队2 天前
慢 SQL 诊断准确率 99.99%,天翼云基于 Apache Doris MCP 的 AI 智能运维实践
大数据·数据库·人工智能·sql·apache
晚风吹人醒.2 天前
LAMP(Linux+Apache+MySQL+PHP)完整搭建过程
linux·服务器·mysql·centos·php·apache·lamp