通过 Iceberg REST Catalog 访问 Databricks Iceberg 表

云器 Lakehouse 通过 Iceberg REST Catalog 协议访问 Databricks Unity Catalog 中的 Iceberg 格式表,元数据实时同步,数据留在原 S3 存储不做搬迁。


前置条件

  • Databricks 工作区:支持 Unity Catalog
  • 云器 Lakehouse 实例:与 Databricks 数据存储(S3)在同一云平台(均为 AWS)
  • Iceberg 表数据存储在用户自己控制的 S3 bucket 中,并为 Lakehouse 配置跨账号读取权限
  • Databricks Service Principal:已获取 OAuth Client ID 和 Secret

Databricks 侧准备

1. 获取 OAuth 凭据

https://accounts.cloud.databricks.com
https://accounts.cloud.databricks.com
Service principals → 创建或选择一个 SP → Credentials & secrets → 记录 Application ID(Client ID)和 Secret。

2. 授予 Catalog 权限

GRANT USE CATALOG ON CATALOG <catalog_name> TO `<application-id>`; GRANT USE SCHEMA ON SCHEMA <catalog_name>.<schema_name> TO `<application-id>`; GRANT SELECT ON SCHEMA <catalog_name>.<schema_name> TO `<application-id>`; GRANT EXTERNAL USE SCHEMA ON SCHEMA <catalog_name>.<schema_name> TO `<application-id>`;

3. 开启 Metastore External Data Access

Databricks Workspace → Catalog → 齿轮图标 → MetastoreExternal data access → 打开。

4. Iceberg 表格式要求(关键)

表格式SHOW TABLESSELECT说明
Iceberg唯一支持的类型
Delta元数据可见,无法查询
Parquet / CSV / JSON同上

在 Databricks 中建 Iceberg 表:

CREATE TABLE catalog.schema.my_iceberg_table USING ICEBERG LOCATION 's3://your-bucket/path/';

5. S3 存储要求

Iceberg 表数据必须在用户控制的 S3 bucket 中。Databricks 托管存储(

s3://dbstorage-prod-*
s3://dbstorage-prod-*
)中的表仅元数据可访问,数据查询会报
S3 403 Forbidden
S3 403 Forbidden

同时 Lakehouse 的 AWS 账号需要对 S3 bucket 具有读权限。Lakehouse 的 AWS 账号 ID 可通过技术支持获取。


创建 Catalog Connection

CREATE CATALOG CONNECTION IF NOT EXISTS databricks_iceberg_conn TYPE ICEBERG_REST URI = 'https://<workspace>.cloud.databricks.com/api/2.1/unity-catalog/iceberg-rest' OAUTH_SERVER_URI = 'https://<workspace>.cloud.databricks.com/oidc/v1/token' ACCESS_REGION = '<s3-bucket-region>' OAUTH_CLIENT_ID = '<oauth-client-id>' OAUTH_CLIENT_SECRET = '<oauth-client-secret>' OAUTH_SCOPE = 'all-apis' WAREHOUSE = '<databricks-catalog-name>';

参数说明

参数必填说明
TYPE
TYPE
固定为
ICEBERG_REST
ICEBERG_REST
,不要加
=
=
URI
URI
Iceberg REST API 端点,注意新路径
/iceberg-rest
/iceberg-rest
,不是旧路径
/iceberg
/iceberg
OAUTH_SERVER_URI
OAUTH_SERVER_URI
Databricks OAuth token 端点。与 URI 不同路径,不填会报
Credential was not sent
Credential was not sent
ACCESS_REGION
ACCESS_REGION
S3 bucket 所在 region,不是 Databricks workspace region
OAUTH_CLIENT_ID
OAUTH_CLIENT_ID
Service Principal 的 Application ID(UUID 格式)
OAUTH_CLIENT_SECRET
OAUTH_CLIENT_SECRET
Service Principal 的 OAuth Secret
OAUTH_SCOPE
OAUTH_SCOPE
固定为
all-apis
all-apis
WAREHOUSE
WAREHOUSE
Databricks Unity Catalog 中的 catalog 名称(如
workspace
workspace
main
main

创建 External Catalog

CREATE EXTERNAL CATALOG databricks_iceberg_catalog CONNECTION databricks_iceberg_conn;


验证

-- 验证连通性 SHOW SCHEMAS IN databricks_iceberg_catalog; -- 查看表列表 SHOW TABLES IN databricks_iceberg_catalog.<schema>; -- 查看表结构 DESC TABLE databricks_iceberg_catalog.<schema>.<iceberg_table>; -- 查询数据 SELECT * FROM databricks_iceberg_catalog.<schema>.<iceberg_table> LIMIT 10;


常见错误

Credential was not sent or was of an unsupported type
Credential was not sent or was of an unsupported type

OAUTH_SERVER_URI
OAUTH_SERVER_URI
未设置。Databricks 的 OAuth token 端点和 Iceberg REST 端点不同路径,必须单独指定。

Legacy Iceberg endpoints deprecated

URI
URI
使用了旧路径
/iceberg
/iceberg
。改为新路径
/iceberg-rest
/iceberg-rest

Must provide 'warehouse' parameter

WAREHOUSE
WAREHOUSE
未设置。Databricks 新的 Iceberg REST API 要求显式指定 catalog 名称。

S3 403 Forbidden

Iceberg 表数据存在 Databricks 托管存储(

s3://dbstorage-prod-*
s3://dbstorage-prod-*
)中,Lakehouse 无权限读取。需将表数据迁移至用户控制的 S3 bucket 并配置跨账号权限。

table or view not found(SELECT 时)

该表不是 Iceberg 格式(可能是 Delta / Parquet / CSV)。SHOW TABLES 能显示所有格式,但只有 Iceberg 格式能通过 SELECT 查询。


管理

-- 查看连接详情 DESC CONNECTION databricks_iceberg_conn; -- 删除 Catalog DROP CATALOG databricks_iceberg_catalog; -- 删除连接 DROP CONNECTION databricks_iceberg_conn;


相关文档

联系我们
预约咨询
微信咨询
电话咨询
邮件咨询