Lakehouse 通过一项称为 BigQuery 目录联合的功能提供与 BigQuery 的互操作性。借助此功能,您可以将由 BigQuery 管理的表(例如 Iceberg 管理的表)公开给外部开源 (OSS) 引擎,例如 Apache Spark 和 Trino。
Apache Iceberg REST Catalog 端点不会创建专用的 Lakehouse 目录容器来存储元数据,而是纯粹充当代理网关。当外部引擎使用
bq:// 仓库前缀进行连接时,网关会将目录请求直接路由到 BigQuery 的内部目录。
这样,您就可以使用标准 BigQuery DDL 或
API 直接在 BigQuery 中创建和管理表,同时让外部 OSS 引擎通过 REST Catalog 端点对这些表进行只读查询。
BigQuery 目录联合的工作原理
借助 BigQuery 目录联合,您可以通过 Lakehouse 运行时目录 Apache Iceberg REST Catalog 端点公开 BigQuery 表,例如 Iceberg 管理的表和 BigQuery 元存储表。
BigQuery 目录联合流程的工作原理如下:
- 在 BigQuery 目录中创建表:您可以使用 DDL 语句在 BigQuery 中创建 Iceberg 管理的表。此表存在于 BigQuery 目录中,受 BigQuery 访问权限控制列表 (ACL) 的控制,并充当 BigQuery REST 资源。
- 从
Lakehouse 运行时目录联合到 BigQuery 仓库:使用
Lakehouse 运行时目录 Apache Iceberg REST API,您可以联合
到由
bq://projects/PROJECT_ID仓库路径格式(或区域版本bq://projects/PROJECT_ID/locations/LOCATION)指定的仓库。 这样,您就可以通过 Lakehouse API 从 Apache Spark 等计算引擎 访问 BigQuery 表。在此配置中,您可以通过 Spark 获得只读体验,但可以通过 BigQuery 获得读写体验。
注意事项
由于 BigQuery 目录联合不会创建专用的 Lakehouse 目录资源,因此其他目录级概念和配置(例如资源层次结构、存储桶和目录区域以及四部分 P.C.N.T 命名结构)不适用于此方法。在底层 API 中,这对应于
CATALOG_TYPE_BIGQUERY配置。请注意,联合 BigQuery 目录不支持存储访问权限委托(凭据自动售卖)。BigQuery 目录联合不同于 无边界 Lakehouse 的跨云数据访问功能。BigQuery 目录联合将 Google Cloud 表公开给外部 OSS 引擎,而 Lakehouse 将 Google Cloud 连接到远程外部目录(例如 Databricks Unity Catalog),以便直接从 BigQuery 和 OSS 引擎查询存储在其他云提供商中的数据,而无需迁移数据。如需详细了解该工作流,请参阅跨云数据访问权限简介。
与由 Apache Iceberg REST Catalog 端点管理的表的比较
BigQuery 目录联合与 Lakehouse 运行时目录使用 Apache Iceberg REST Catalog 端点的工作流不同,具体如下:
- 资源管理和目录存储:联合表作为 BigQuery REST 资源驻留在 BigQuery 目录中,而 Lakehouse 运行时目录充当代理网关。当 Lakehouse 运行时目录使用 Apache Iceberg REST Catalog 端点时,表直接存储在目录中,作为 Lakehouse REST 资源。
- 访问权限控制:联合表使用 BigQuery IAM 权限和访问控制列表 (ACL)。当 Lakehouse 运行时目录使用 Apache Iceberg REST Catalog 端点时,表使用 Lakehouse ACL。
- 引擎读写功能:联合表通过 BigQuery 提供读写 访问权限,但外部 引擎(例如 Spark)提供只读访问权限。当 Lakehouse 运行时目录使用 Apache Iceberg REST Catalog 端点时,表支持来自 BigQuery API 和外部引擎(例如 Spark)的读写操作。
准备工作
-
验证是否已为您的 Google Cloud 项目启用结算功能。
-
启用 BigLake API。
启用 API 所需的角色
如需启用 API,您需要拥有
serviceusage.services.enable权限。如果您创建了项目,则可能已通过所有者角色 (roles/owner) 拥有此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获取此权限。了解如何授予角色。
所需的角色
如需获得在 BigQuery 中使用目录联合所需的权限,请让管理员向您授予以下 IAM 角色:
-
读取目录资源和查询表数据:
- 项目的 BigLake Viewer (
roles/biglake.viewer) 角色 - Storage Object Viewer (
roles/storage.objectViewer) 针对 Cloud Storage 存储桶
- 项目的 BigLake Viewer (
-
使用 BigQuery 目录联合执行数据操纵语言 (DML) 操作:
- 项目的 BigQuery Data Editor (
roles/bigquery.dataEditor) 角色 - 针对 Cloud Storage 存储桶的 Storage Admin (
roles/storage.admin) 角色。如果您使用查询引擎(例如 Managed Service for Apache Spark)执行 DML 操作,请向您用于在该引擎中运行作业的服务帐号授予这些角色。
- 项目的 BigQuery Data Editor (
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
您也可以通过自定义 角色或其他预定义 角色来获取所需的权限。
设置 BigQuery 目录联合
您还可以选择添加 BigQuery 位置,以
使用
bq://projects/PROJECT_ID/locations/LOCATION
格式将未来的请求限制为单个位置。
由于这些资源由 BigQuery 管理,因此您必须拥有 适用的 所需权限。
为联合表创建命名空间
为 BigQuery 目录联合配置客户端后,您可以为联合表创建命名空间。
Spark
如需使用 BigQuery 目录联合,请添加 LOCATION 和 DBPROPERTIES 子句:
spark.sql("CREATE NAMESPACE IF NOT EXISTS NAMESPACE_NAME LOCATION 'gs://BUCKET_NAME/NAMESPACE_NAME' WITH DBPROPERTIES ('gcp-region' = 'LOCATION');") spark.sql("USE NAMESPACE_NAME;")
替换以下内容:
NAMESPACE_NAME:命名空间的名称。BUCKET_NAME:您与目录搭配使用的 Cloud Storage 存储桶。LOCATION:BigQuery 位置。默认值为US多区域。
Trino
如需使用 BigQuery 目录联合,请添加 LOCATION 和 gcp-region 属性:
CREATE SCHEMA IF NOT EXISTS CATALOG_NAME.SCHEMA_NAME WITH ( LOCATION = 'gs://BUCKET_NAME/SCHEMA_NAME', "gcp-region" = 'LOCATION'); USE CATALOG_NAME.SCHEMA_NAME;
替换以下内容:
CATALOG_NAME:使用 Apache Iceberg REST Catalog 端点的 Trino 目录的名称。SCHEMA_NAME:架构的名称。BUCKET_NAME:您与目录搭配使用的 Cloud Storage 存储桶。LOCATION:BigQuery 位置。默认值为US多区域。
在 BigQuery 中查询联合表
您在联合目录中创建的表在 BigQuery 中可见,并且可以使用标准 BigQuery SQL 直接查询(无需四部分 P.C.N.T 名称):
SELECT * FROM `NAMESPACE_NAME.TABLE_NAME`;
替换以下内容:
NAMESPACE_NAME:命名空间的名称。TABLE_NAME:表的名称。