免费开始|联系销售

R2 Data Catalog: 零出口费用的托管式 Apache Iceberg 表

2025-04-10

阅读需时 4 分钟

Apache Iceberg 正在迅速成为在对象存储中查询大型分析数据集的标准表格式。 我们亲身经历了这一趋势,越来越多的开发者和数据团队在 Cloudflare R2 上采用 Iceberg。 但到目前为止,将 Iceberg 与 R2 结合使用意味着要管理额外的基础设施或依赖外部数据目录。

因此,我们正在解决这个问题。 今天,我们推出了开放测试版的 R2 Data Catalog,这是一个直接构建到您的 Cloudflare R2 bucket 中的托管式 Apache Iceberg 目录。

如果您还不熟悉 Iceberg,它是一种开放的表格式,专为对象存储中存储的数据集进行大规模分析而构建。 借助 R2 Data Catalog,您可以获得 Iceberg 闻名的类数据库功能 – ACID 事务、schema 演化和高效查询 – 而无需管理自己的外部目录的开销。

R2 Data Catalog 公开了一个标准的 Iceberg REST catalog 接口,因此您可以连接已经使用的引擎,如 PyIcebergSnowflakeSpark。 而且,与 R2 一样,始终没有出口费用,这意味着无论您的数据从哪个云或区域使用,您都不必担心不断增长的数据传输成本。

准备好立即在 R2 中查询数据了吗? 进入 developer docs,只需点击几下即可在您的 R2 bucket 上启用数据目录。 或者继续阅读以了解有关 Iceberg、数据目录、元数据文件如何在底层工作以及如何创建您的第一个 Iceberg 表的更多信息。

什么是 Apache Iceberg?

Apache Iceberg 是一种开放的表格式,用于分析对象存储中的大型数据集。 它将类数据库功能 – ACID 事务、时间旅行和 schema 演化 – 带到以 ParquetORC 等格式存储的文件中。

从历史上看,数据湖只是对象存储中原始文件的集合。 但是,如果没有统一的元数据层,数据集很容易损坏,难以演化,并且查询通常需要昂贵的整表扫描。

Iceberg 通过以下方式解决这些问题:

Iceberg 已经得到了 Apache Spark、Trino、Snowflake、DuckDB 和 ClickHouse 等引擎的 广泛支持,并且背后有一个快速增长的社区。

Iceberg 表是如何存储的

在内部,Iceberg 表是数据文件(通常以 Parquet 或 ORC 等列式格式存储)和元数据文件(通常以 JSON 或 Avro 格式存储)的集合,用于描述表快照、schema 和分区布局。

要了解查询引擎如何有效地与 Iceberg 表交互,查看 Iceberg 元数据文件(简化版)会有所帮助:

{
 "format-version": 2,
 "table-uuid": "0195e49b-8f7c-7933-8b43-d2902c72720a",
 "location": "s3://my-bucket/warehouse/0195e49b-79ca/table",
 "current-schema-id": 0,
 "schemas": [
  {
   "schema-id": 0,
   "type": "struct",
   "fields": [
    { "id": 1, "name": "id", "required": false, "type": "long" },
    { "id": 2, "name": "data", "required": false, "type": "string" }
   ]
  }
 ],
 "current-snapshot-id": 3567362634015106507,
 "snapshots": [
  {
   "snapshot-id": 3567362634015106507,
   "sequence-number": 1,
   "timestamp-ms": 1743297158403,
   "manifest-list": "s3://my-bucket/warehouse/0195e49b-79ca/table/metadata/snap-3567362634015106507-0.avro",
   "summary": {},
   "schema-id": 0
  }
 ],
 "partition-specs": [{ "spec-id": 0, "fields": [] }]
}

一些重要的组件是:

通过读取 Iceberg 元数据,查询引擎可以有效地修剪分区,仅加载相关的快照,并仅获取所需的数据文件,从而加快查询速度。

为什么需要数据目录?

虽然 Iceberg 数据和元数据文件本身直接位于对象存储(如 R2)中,但表列表和指向当前元数据的指针需要由数据目录集中跟踪。

将数据目录视为图书馆的索引系统。 虽然书籍(您的数据)在物理上分布在书架(对象存储)上,但索引提供了一个关于存在哪些书籍、它们的位置以及它们的最新版本的单一事实来源。 如果没有此索引,读者(查询引擎)将浪费时间搜索书籍,可能访问过时的版本,或者可能以使其无法找到的方式意外地将新书上架。

同样,数据目录确保一致、协调的访问,允许多个查询引擎安全地读取和写入同一张表,而不会发生冲突或数据损坏。

在 R2 上创建您的第一个 Iceberg 表

准备好尝试了吗? 这是一个使用 PyIceberg 和 Python 的快速示例,可帮助您入门。 有关详细的分步指南,请查看我们的 developer docs

  1. 在您的 bucket 上启用 R2 Data Catalog:
npx wrangler r2 bucket catalog enable my-bucket

或者使用 Cloudflare 仪表板:导航至 R2 Object Storage > Settings > R2 Data Catalog,然后点击 Enable

  1. 创建一个具有 R2 存储和数据目录权限的 Cloudflare API token

  2. 安装 PyIcebergPyArrow,然后打开 Python shell 或 notebook:

pip install pyiceberg pyarrow
  1. 连接到目录并创建表:
import pyarrow as pa
from pyiceberg.catalog.rest import RestCatalog
# Define catalog connection details (replace variables)
WAREHOUSE = "<WAREHOUSE>"
TOKEN = "<TOKEN>"
CATALOG_URI = "<CATALOG_URI>"
# Connect to R2 Data Catalog
catalog = RestCatalog(
  name="my_catalog",
  warehouse=WAREHOUSE,
  uri=CATALOG_URI,
  token=TOKEN,
)
# Create default namespace
catalog.create_namespace("default")
# Create simple PyArrow table
df = pa.table({
  "id": [1, 2, 3],
  "name": ["Alice", "Bob", "Charlie"],
})
# Create an Iceberg table
table = catalog.create_table(
  ("default", "my_table"),
  schema=df.schema,
)

现在,您可以像使用任何 Apache Iceberg 表一样,附加更多数据或运行查询。

定价

在 R2 Data Catalog 处于开放测试阶段时,除了查询引擎访问数据产生的标准 R2 存储和操作成本外,不会产生额外费用。 启用 R2 Data Catalog 的 bucket 的 Storage pricing 与标准 R2 bucket 相同 – 每 GB-月 0.015 美元。 与往常一样,直接从 R2 bucket 出站的出口费用始终为 0 美元。

未来,我们计划为目录操作(例如,创建表、检索表元数据等)和数据压缩引入定价。

以下是我们目前对未来定价的考虑。 我们将在计费开始前详细说明时间安排,以便您可以自信地规划您的工作负载。

定价

R2 存储,标准存储类 | 每 GB-月 0.015 美元(无变化) R2 Class A 操作 | 每百万次操作 4.50 美元(无变化) R2 Class B 操作 | 每百万次操作 0.36 美元(无变化) Data Catalog 操作,例如,创建表、获取表元数据、更新表属性 | 每百万次目录操作 9.00 美元 Data Catalog 压缩数据处理 | 每 GB 处理 0.05 美元,每百万个对象处理 4.00 美元 数据出口 | 0 美元(无变化,始终免费)

接下来是什么?

我们很高兴看到您如何使用 R2 Data Catalog! 如果您以前从未使用过 Iceberg – 甚至没有使用过分析数据 – 我们认为这是开始使用的最简单方法。

我们路线图上的下一步是解决压缩和表优化。 查询引擎在处理较少但较大的数据文件时通常表现更好。 我们将自动将小数据文件的集合重写为较大的文件,以提供更快的查询性能。

我们还在与广泛的 Apache Iceberg 社区合作,以扩展查询引擎与 Iceberg REST Catalog 规范的兼容性。

我们很乐意听取您的反馈。 加入 Cloudflare Developer Discord 提出问题并在公开测试期间分享您的想法。 有关更多详细信息、示例和指南,请访问我们的 developer documentation