BigQuery 跨引擎访问 Iceberg:无服务器 REST Catalog 打通多引擎数据孤岛

2026-05-23 31 预计阅读时间:1 分钟
来源:infoq.com AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:8 分钟

数据仓库和计算引擎长期割裂,做报表用 BigQuery,跑机器学习用 Spark,处理实时流用 Flink,数据往往要在不同系统间来回搬运、复制。在最近的 Apache Iceberg Summit 上,Google 宣布 BigQuery 支持无服务器 Iceberg REST Catalog 的预览版,让 BigQuery、Spark、Flink 和 Trino 能够直接读写同一份 Apache Iceberg 表数据,不再需要数据导出或冗余存储。

无服务器 REST Catalog:统一元数据的钥匙

过去,多引擎共用一份数据的瓶颈往往在元数据管理。Hive Metastore 是最常见的选择,但要自己维护高可用服务,且不同引擎对接时经常遇到兼容性坑。Iceberg 规范中定义了 REST Catalog API,把元数据操作标准化为 HTTP 接口。

Google 这次推出的无服务器 Iceberg REST Catalog,本质上是把这套 REST API 的后端托管在了 BigQuery 内部。团队不需要再部署和维护独立的 Catalog 服务,Spark、Flink 或 Trino 只需配置一个 REST endpoint,就能直接访问 BigQuery 管理的 Iceberg 表元数据,再根据元数据指向的路径去 Google Cloud Storage (GCS) 读取底层 Parquet 文件。

同表同源:不同引擎的协作场景

打通 Catalog 后,最直接的收益是消除数据搬运。一个典型的协作链路可以这样运转:

  • Flink 持续将 Kafka 的事件流写入 Iceberg 表,按小时分区落地到 GCS。
  • BigQuery 直接对这张表发出标准 SQL,供业务团队做即席查询和看板刷新。
  • Spark 读取同一张表的快照,做特征提取和模型训练。
  • Trino 跨多张 Iceberg 表做联邦关联分析。

整个过程中,数据只有一份,元数据由 BigQuery 的 REST Catalog 统一分发,各引擎通过 Iceberg 的快照隔离机制保证读写不冲突。

动手实践:用 Spark 和 Trino 连接 BigQuery Iceberg Catalog

由于来源并未公开预览版的具体 REST endpoint URL 和鉴权细节,以下示例基于 Iceberg REST Catalog 的标准规范给出典型配置。实际使用时,需要将 uri 替换为 Google Cloud 预览版提供的 BigQuery Iceberg REST Catalog 地址,并配置相应的 GCP 凭证。

PySpark 读写示例

启动 Spark 时,将 Catalog 类型设为 rest,指向 BigQuery 提供的 endpoint:

from pyspark.sql import SparkSession

# 构建 Spark Session,配置 Iceberg REST Catalog
# 注意:uri 和 warehouse 需替换为 GCP 预览版实际提供的地址与你的 GCS bucket
spark = SparkSession.builder \
    .appName("bigquery-iceberg-cross-engine") \
    .config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
    .config("spark.sql.catalog.bigquery_catalog", "org.apache.iceberg.spark.SparkCatalog") \
    .config("spark.sql.catalog.bigquery_catalog.type", "rest") \
    .config("spark.sql.catalog.bigquery_catalog.uri", "https://bigquery.googleapis.com/iceberg/v1/catalogs/my-project-catalog") \
    .config("spark.sql.catalog.bigquery_catalog.warehouse", "gs://my-data-lake/iceberg-warehouse") \
    .config("spark.sql.catalog.bigquery_catalog.rest.auth.type", "oauth2") \
    .config("spark.sql.catalog.bigquery_catalog.rest.auth.oauth2.credential", "your-gcp-service-account-key-json-path") \
    .getOrCreate()

# 读取 BigQuery 中已存在的 Iceberg 表
df = spark.sql("SELECT * FROM bigquery_catalog.my_dataset.events_stream")
df.show(5)

# 写入新数据,BigQuery 和其他引擎随后也能立即看到
spark.sql("""
  INSERT INTO bigquery_catalog.my_dataset.events_stream 
  VALUES ('user_login', '2024-06-01T10:00:00Z', 101)
""")

Trino 查询示例

在 Trino 中配置同样的 REST Catalog,即可用标准 SQL 查询。在 Trino 的 catalog/bigquery_iceberg.properties 中写入:

connector.name=iceberg
iceberg.catalog.type=rest
iceberg.rest-catalog.uri=https://bigquery.googleapis.com/iceberg/v1/catalogs/my-project-catalog
iceberg.rest-catalog.warehouse=gs://my-data-lake/iceberg-warehouse
# 鉴权配置视 Trino 版本与 GCP 要求而定,通常需配置 service account 或 token

配置完成后,在 Trino CLI 中直接查询:

-- 查看表结构
SHOW COLUMNS FROM bigquery_iceberg.my_dataset.events_stream;

-- 聚合分析
SELECT event_type, count(*) AS cnt 
FROM bigquery_iceberg.my_dataset.events_stream 
WHERE event_time >= TIMESTAMP '2024-06-01' 
GROUP BY event_type;

落地前的考量与检查清单

跨引擎共享 Iceberg 表听起来理想,但真正落地时仍有几道门槛需要正视:

  1. 权限对齐:BigQuery 和 Spark/Trino 访问的是同一套 GCS 数据文件。必须确保各引擎使用的 Service Account 对目标 GCS bucket 具有一致的读写权限,否则会出现"元数据可见但数据读不出"的报错。
  2. 类型兼容性:BigQuery 对 Iceberg 的数据类型支持仍有边界(例如部分复杂嵌套类型或特定精度的时间戳),在设计表 Schema 时,优先选用各引擎都能无损映射的类型。
  3. REST Catalog 性能:元数据请求从本地 Metastore 调用变成了跨网络的 HTTP 调用。对于包含大量分区和快照的历史表,高频的元数据拉取可能会引入延迟,建议结合 Iceberg 的分支推送或元数据压缩机制来优化。
  4. 预览版风险:当前功能处于预览阶段,SLA 和 API 稳定性未达到生产级要求,不建议立即将核心流水线全量迁移,先在非关键的分析场景中跑通闭环。

采纳检查清单: - [ ] 确认 GCS bucket 的 IAM 策略已覆盖所有计算引擎的 Service Account - [ ] 验证 Iceberg 表的 Schema 中的数据类型在 BigQuery、Spark、Trino 中均兼容 - [ ] 获取 BigQuery Iceberg REST Catalog 的预览版 endpoint 与鉴权方式 - [ ] 在测试环境用 Spark 写入、BigQuery 查询、Trino 关联,验证快照隔离与数据可见性 - [ ] 评估高频元数据查询场景下的 REST API 延迟

这次更新标志着 BigQuery 从封闭的仓库引擎向开放的数据湖架构迈出了实质性的一步。对于已经在 GCP 上使用 BigQuery 且有流处理或机器学习需求的团队,无服务器 REST Catalog 提供了一条去掉数据冗余的清晰路径。


相关推荐