免费开始|联系销售

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 接口,因此您可以连接已经使用的引擎,如 PyIceberg、Snowflake 和 Spark。 而且,与 R2 一样,始终没有出口费用,这意味着无论您的数据从哪个云或区域使用,您都不必担心不断增长的数据传输成本。

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

什么是 Apache Iceberg?

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

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

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. 安装 PyIceberg 和 PyArrow,然后打开 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。