BigQuery 中的 Apache Iceberg BigLake 表

适用于 Apache Iceberg 的 BigQuery BigLake 表(以下称为“BigQuery 中的 BigLake Iceberg 表”)为在 Google Cloud上构建开放格式湖仓一体提供了基础。BigQuery 中的 BigLake Iceberg 表提供与标准 BigQuery 表相同的全托管式体验,但将数据存储在客户拥有的存储桶中。BigQuery 中的 BigLake Iceberg 表支持开放式 Iceberg 表格式,可在单个数据副本上与开源和第三方计算引擎实现更好的互操作性。

BigQuery 中的 Apache Iceberg BigLake 表与 Apache Iceberg 外部表不同。BigQuery 中的 Apache Iceberg BigLake 表是全托管式表,可直接在 BigQuery 中进行修改,而 Apache Iceberg 外部表由客户管理,并提供 BigQuery 的只读权限。

BigQuery 中的 BigLake Iceberg 表支持以下功能:

架构

BigQuery 中的 BigLake Iceberg 表可为位于您自己的云存储桶中的表提供 BigQuery 资源管理的便利。您可以在这些表上使用 BigQuery 和开源计算引擎,而无需将数据从您控制的存储桶中移出。您必须先配置 Cloud Storage 存储桶,然后才能开始在 BigQuery 中使用 BigLake Iceberg 表。

BigQuery 中的 BigLake Iceberg 表使用 BigLake metastore 作为所有 Iceberg 数据的统一运行时 metastore。BigLake metastore 提供了一个可信来源,用于管理来自多个引擎的元数据,并支持引擎互操作性。

下图简要展示了托管式表架构:

BigQuery 架构图中的 BigLake Iceberg 表。

此表管理会对存储桶产生以下影响:

  • BigQuery 会在存储桶中创建新的数据文件,以响应写入请求和后台存储优化(例如 DML 语句和流式处理)。
  • 当您在 BigQuery 中删除托管式表时,BigQuery 会在时间旅行期到期后在 Cloud Storage 中收集关联的数据文件。

在 BigQuery 中创建 BigLake Iceberg 表的过程与创建 BigQuery 表类似。由于 Iceberg 表以开放格式在 Cloud Storage 上存储数据,因此您必须执行以下操作:

  • 使用 WITH CONNECTION 指定 Cloud 资源连接,以便为 BigLake 访问 Cloud Storage 配置连接凭据。
  • 使用 file_format = PARQUET 语句将数据存储的文件格式指定为 PARQUET
  • 使用 table_format = ICEBERG 语句将开源元数据表格式指定为 ICEBERG

最佳做法

在 BigQuery 外部直接更改文件或向存储桶添加文件可能会导致数据丢失或不可恢复的错误。下表介绍了可能的场景:

操作 结果 预防措施
向 BigQuery 外部的存储桶添加新文件。 数据丢失:BigQuery 不会跟踪在 BigQuery 外部添加的新文件或对象。未跟踪的文件会由后台垃圾回收进程删除。 仅通过 BigQuery 添加数据。这可让 BigQuery 跟踪这些文件并防止它们被垃圾回收。
为防止意外添加和数据丢失,我们还建议您限制对 BigQuery 中包含 BigLake Iceberg 表的存储桶的外部工具写入权限。
在 BigQuery 中使用非空前缀创建一个新的 BigLake Iceberg 表。 数据丢失:BigQuery 不会跟踪现有数据,因此这些文件会被视为未跟踪,并由后台垃圾回收进程删除。 仅在 BigQuery 中使用空前缀创建新的 BigLake Iceberg 表。
修改或替换 BigQuery 数据文件中的 BigLake Iceberg 表。 数据丢失:在外部修改或替换时,表会无法通过一致性检查,并且变得不可读。对表进行的查询会失败。
您无法通过自助方式从这个时间点恢复。如需数据恢复方面的帮助,请与支持团队联系。
仅通过 BigQuery 修改数据。这可让 BigQuery 跟踪这些文件并防止它们被垃圾回收。
为防止意外添加和数据丢失,我们还建议您限制对 BigQuery 中包含 BigLake Iceberg 表的存储桶的外部工具写入权限。
在 BigQuery 中使用相同或重叠的 URI 创建两个 BigLake Iceberg 表。 数据丢失:BigQuery 不会桥接 BigQuery 中 BigLake Iceberg 表的相同 URI 实例。每个表的后台垃圾回收进程都会将相反表的文件视为未跟踪,并将其删除,从而导致数据丢失。 为 BigQuery 中的每个 BigLake Iceberg 表使用唯一的 URI。

Cloud Storage 存储桶配置最佳实践

Cloud Storage 存储桶的配置及其与 BigLake 的连接会直接影响 BigQuery 中 BigLake Iceberg 表的性能、费用、数据完整性、安全性和治理。以下最佳实践可帮助您完成此配置:

  • 选择一个名称,明确表明该存储桶仅用于 BigQuery 中的 BigLake Iceberg 表。

  • 选择与您的 BigQuery 数据集位于同一区域的单区域 Cloud Storage 存储桶。这种协调可以避免数据传输费用,从而提高性能并降低成本。

  • 默认情况下,Cloud Storage 会将数据存储在标准存储类别中,以提供足够的性能。如需优化数据存储费用,您可以启用 Autoclass 来自动管理存储类别转换。Autoclass 从标准存储类别开始,并将未被访问的对象移至越来越冷的类别,以降低存储费用。再次读取对象时,系统会将其移回 Standard 类别。

  • 启用统一存储桶级访问权限禁止公开访问

  • 验证是否已向正确的用户和服务账号分配了所需的角色

  • 为防止 Cloud Storage 存储桶中的 Iceberg 数据意外删除或损坏,请限制贵组织中大多数用户的写入和删除权限。为此,您可以设置存储桶权限政策,并设置条件,以便拒绝所有用户(除了您指定的用户)的 PUTDELETE 请求。

  • 应用 Google 管理的客户管理的加密密钥,以便对敏感数据提供额外保护。

  • 启用审核日志记录,以实现运营透明度、问题排查和数据访问监控。

  • 保留默认的软删除政策(保留 7 天)以防止意外删除。不过,如果您发现 Iceberg 数据已被删除,请与支持团队联系,而不是手动恢复对象,因为 BigQuery 元数据不会跟踪在 BigQuery 外部添加或修改的对象。

  • 系统会自动启用自适应文件大小调整、自动聚类和垃圾回收功能,以帮助优化文件性能和成本。

  • 请避免使用以下 Cloud Storage 功能,因为 BigQuery 不支持在 BigLake Iceberg 表中使用这些功能:

您可以通过使用以下命令创建存储桶来实现这些最佳实践:

gcloud storage buckets create gs://BUCKET_NAME \
    --project=PROJECT_ID