连接到 Azure Data Lake Storage Gen2 和 Blob 存储

注意

本文介绍用于配置对 Azure Data Lake Storage Gen2 的访问的旧模式。 Databricks 建议使用 Unity Catalog 配置对 Azure Data Lake Storage Gen2 和卷的访问权限,以便与文件直接交互。 请参阅使用 Unity Catalog 连接到云对象存储

本文介绍如何从 Azure Databricks 连接到 Azure Data Lake Storage Gen2 和 Blob 存储。

注意

使用 Azure 凭据连接到 Azure Data Lake Storage Gen2 或 Blob 存储

以下凭据可用于访问 Azure Data Lake Storage Gen2 或 Blob 存储:

  • OAuth 2.0 和 Microsoft Entra ID 服务主体:Databricks 建议使用 Microsoft Entra ID 服务主体连接到 Azure 存储。 若要创建 Microsoft Entra ID 服务主体并为其提供对 Azure 存储帐户的访问权限,请参阅使用服务主体通过 Microsoft Entra ID(前 Azure Active Directory)访问存储

    若要创建 Microsoft Entra ID 服务主体,你必须在 Microsoft Entra ID(前 Azure Active Directory)上有 Application Administrator 角色或 Application.ReadWrite.All 权限。 若要在某个存储帐户中分配角色,你必须是所有者,或者是在该存储帐户中具有用户访问管理员 Azure RBAC 角色的用户。

  • 共享访问签名 (SAS):可以使用存储 SAS 令牌访问 Azure 存储。 使用 SAS,你可以通过具有细粒度访问控制的临时令牌来限制对存储帐户的访问。

    你只能授予自己对存储帐户、容器或文件所拥有的 SAS 令牌权限。

  • 帐户密钥:可以使用存储帐户访问密钥来管理对 Azure 存储的访问。 存储帐户访问密钥提供对存储帐户配置以及数据的完全访问权限。 Databricks 建议使用 Microsoft Entra ID 服务主体或 SAS 令牌(而不是帐户密钥)连接到 Azure 存储。

    若要查看帐户的访问密钥,你必须在存储帐户中具有所有者、参与者或存储帐户密钥操作员服务角色。

Databricks 建议使用机密范围来存储所有凭据。 可以向工作区中的用户、服务主体和组授予读取机密范围的访问权限。 这可以保护 Azure 凭据,同时允许用户访问 Azure 存储。 若要创建机密范围,请参阅机密范围

设置 Spark 属性以配置 Azure 凭据来访问 Azure 存储

可以设置 Spark 属性,以配置 Azure 凭据来访问 Azure 存储。 凭据范围可以限定为某个群集或笔记本。 同时使用群集访问控制和笔记本访问控制来保护对 Azure 存储的访问。 请参阅计算权限使用 Databricks 笔记本进行协作

注意

Microsoft Entra ID 服务主体还可用于从 SQL 仓库访问 Azure 存储,请参阅启用数据访问配置

若要设置 Spark 属性,请在群集的 Spark 配置或笔记本中使用以下代码片段:

Azure 服务主体

使用以下格式设置群集 Spark 配置:

spark.hadoop.fs.azure.account.auth.type.<storage-account>.dfs.core.chinacloudapi.cn OAuth
spark.hadoop.fs.azure.account.oauth.provider.type.<storage-account>.dfs.core.chinacloudapi.cn org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider
spark.hadoop.fs.azure.account.oauth2.client.id.<storage-account>.dfs.core.chinacloudapi.cn <application-id>
spark.hadoop.fs.azure.account.oauth2.client.secret.<storage-account>.dfs.core.chinacloudapi.cn {{secrets/<secret-scope>/<service-credential-key>}}
spark.hadoop.fs.azure.account.oauth2.client.endpoint.<storage-account>.dfs.core.chinacloudapi.cn https://login.chinacloudapi.cn/<directory-id>/oauth2/token

可以在笔记本中使用 spark.conf.set,如以下示例所示:

service_credential = dbutils.secrets.get(scope="<secret-scope>",key="<service-credential-key>")

spark.conf.set("fs.azure.account.auth.type.<storage-account>.dfs.core.chinacloudapi.cn", "OAuth")
spark.conf.set("fs.azure.account.oauth.provider.type.<storage-account>.dfs.core.chinacloudapi.cn", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
spark.conf.set("fs.azure.account.oauth2.client.id.<storage-account>.dfs.core.chinacloudapi.cn", "<application-id>")
spark.conf.set("fs.azure.account.oauth2.client.secret.<storage-account>.dfs.core.chinacloudapi.cn", service_credential)
spark.conf.set("fs.azure.account.oauth2.client.endpoint.<storage-account>.dfs.core.chinacloudapi.cn", "https://login.chinacloudapi.cn/<directory-id>/oauth2/token")

替换

  • <secret-scope> 替换为 Databricks 机密范围名称。
  • <service-credential-key> 替换为包含客户端密码的密钥的名称。
  • <storage-account> 替换为 Azure 存储帐户的名称。
  • <application-id>,包含 Microsoft Entra ID 应用程序的应用程序(客户端)ID
  • <directory-id>,包含 Microsoft Entra ID 应用程序的目录(租户)ID

SAS 令牌

可以在同一个 Spark 会话中为多个存储帐户配置 SAS 令牌。

spark.conf.set("fs.azure.account.auth.type.<storage-account>.dfs.core.chinacloudapi.cn", "SAS")
spark.conf.set("fs.azure.sas.token.provider.type.<storage-account>.dfs.core.chinacloudapi.cn", "org.apache.hadoop.fs.azurebfs.sas.FixedSASTokenProvider")
spark.conf.set("fs.azure.sas.fixed.token.<storage-account>.dfs.core.chinacloudapi.cn", dbutils.secrets.get(scope="<scope>", key="<sas-token-key>"))

替换

  • <storage-account> 替换为 Azure 存储帐户名称。
  • <scope> 替换为 Azure Databricks 机密范围名称。
  • <sas-token-key> 替换为包含 Azure 存储 SAS 令牌的密钥的名称。

帐户密钥

spark.conf.set(
    "fs.azure.account.key.<storage-account>.dfs.core.chinacloudapi.cn",
    dbutils.secrets.get(scope="<scope>", key="<storage-account-access-key>"))

替换

  • <storage-account> 替换为 Azure 存储帐户名称。
  • <scope> 替换为 Azure Databricks 机密范围名称。
  • <storage-account-access-key> 替换为包含 Azure 存储帐户访问密钥的密钥的名称。

访问 Azure 存储

正确配置用于访问 Azure 存储容器的凭据后,可以使用 URI 来与存储帐户中的资源交互。 Databricks 建议使用 abfss 驱动程序以获得更高的安全性。

spark.read.load("abfss://<container-name>@<storage-account-name>.dfs.core.chinacloudapi.cn/<path-to-data>")

dbutils.fs.ls("abfss://<container-name>@<storage-account-name>.dfs.core.chinacloudapi.cn/<path-to-data>")
CREATE TABLE <database-name>.<table-name>;

COPY INTO <database-name>.<table-name>
FROM 'abfss://container@storageAccount.dfs.core.chinacloudapi.cn/path/to/folder'
FILEFORMAT = CSV
COPY_OPTIONS ('mergeSchema' = 'true');

示例笔记本

ADLS Gen2 OAuth 2.0 与 Microsoft Entra ID(旧称 Azure Active Directory)服务主体笔记本

获取笔记本

Azure Data Lake Storage Gen2 已知问题

如果尝试访问通过 Azure 门户创建的存储容器,可能会收到以下错误:

StatusCode=404
StatusDescription=The specified filesystem does not exist.
ErrorCode=FilesystemNotFound
ErrorMessage=The specified filesystem does not exist.

启用分层命名空间后,不需要通过 Azure 门户创建容器。 如果看到此问题,请通过 Azure 门户删除 Blob 容器。 几分钟后,便可访问容器。 或者,可以更改 abfss URI 以使用其他容器,只要此容器不是通过 Azure 门户创建的。

请参阅 Azure 文档中的 Azure Data Lake Storage Gen2 的已知问题

用于存储和访问 Azure Databricks 中数据的弃用模式

下面是已弃用的存储模式: