重要
本文档已停用,可能不会更新。
本文介绍用于配置对 Azure Data Lake Storage 的访问的旧模式。 Databricks 建议使用 Unity Catalog 配置对 Azure Data Lake Storage 和磁盘卷的访问,以便与文件直接交互。 请参阅 在 Unity Catalog 中使用 Azure 托管标识访问存储。
本文介绍如何从 Azure Databricks 连接到 Azure Data Lake Storage 和 Blob 存储。
注意
旧版 Windows Azure 存储 Blob 驱动程序 (WASB) 已弃用。 与 WASB 相比,ABFS 具有许多优势。 请参阅有关 ABFS 的 Azure 文档。 有关使用旧版 WASB 驱动程序的文档,请参阅使用 WASB(旧版)连接到 Azure Blob 存储。
步骤 1:注册Microsoft Entra ID应用程序
使用 Microsoft Entra ID 注册应用程序会创建一个服务主体,该主体可用于提供对 Azure 存储帐户的访问权限。
若要注册 Microsoft Entra ID 应用程序,你必须在 Microsoft Entra ID 中具有 Application Administrator 角色或 Application.ReadWrite.All 权限。
- 在 Azure 门户中,转到“Microsoft Entra ID”服务。
- 在“管理”下,单击“应用注册” 。
- 单击“+ 新建注册”。 输入应用程序的名称,然后单击“注册”。
- 单击“证书和机密”。
- 单击“+ 新建客户端密码”。
- 添加机密说明,并单击“添加”。
- 复制新密钥的值并保存。
- 在应用程序注册概述中,复制并保存“应用程序(客户端) ID”和“目录(租户) ID” 。
步骤 2:将角色分配给服务主体
可以通过向与存储帐户关联的 Microsoft Entra ID 应用程序注册分配角色来控制对存储资源的访问。 可能需要根据特定要求分配其他角色。
若要在存储帐户上分配角色,必须在存储帐户上具有所有者或用户访问管理员Azure RBAC 角色。
- 在 Azure 门户中,转到“存储帐户”服务。
- 选择要用于此应用程序注册的Azure存储帐户。
- 单击访问控制 (IAM)。
- 单击“+ 添加”,然后从下拉菜单中选择“添加角色分配” 。
- 将“选择”字段设置为 Microsoft Entra ID 应用程序名称,并将“角色”设置为“Storage Blob 数据贡献者”。
- 单击“ 保存”。
步骤 3:在 Azure Databricks 中配置Azure凭据
使用要访问Azure存储帐户的凭据配置Azure Databricks群集或笔记本。
支持的凭据类型和机密存储
以下凭据可用于访问 Azure Data Lake Storage 或 Blob 存储:
具有 Microsoft Entra ID 服务主体的 OAuth 2.0:Databricks 建议使用 Microsoft Entra ID 服务主体连接到 Azure Data Lake Storage。 若要创建Microsoft Entra ID服务主体,并为其提供对Azure存储帐户的访问权限,请完成上述步骤 1 和 2。
若要创建 Microsoft Entra ID 服务主体,必须在 Microsoft Entra ID 中具有
Application Administrator角色或Application.ReadWrite.All权限。 若要在某个存储帐户中分配角色,你必须是所有者,或者是在该存储帐户中具有用户访问管理员 Azure RBAC 角色的用户。重要
Blob 存储服务不支持 Microsoft Entra ID 服务主体。
共享访问签名 (SAS):可以使用存储 SAS 令牌访问 Azure 存储。 使用 SAS,你可以通过具有细粒度访问控制的临时令牌来限制对存储帐户的访问。
你只能授予自己对存储帐户、容器或文件所拥有的 SAS 令牌权限。
帐户密钥:可以使用存储帐户访问密钥来管理对 Azure 存储的访问。 存储帐户访问密钥提供对存储帐户配置以及数据的完全访问权限。 Databricks 建议使用 Microsoft Entra ID 服务主体或 SAS 令牌(而不是帐户密钥)连接到 Azure 存储。
若要查看帐户的访问密钥,你必须在存储帐户中具有所有者、参与者或存储帐户密钥操作员服务角色。
Databricks 建议使用机密范围来存储所有凭据。 可以向工作区中的用户、服务主体和组授予读取机密范围的访问权限。 这可以保护 Azure 凭据,同时允许用户访问 Azure 存储。 若要创建机密范围,请参阅管理机密范围。
注意
Microsoft Entra ID 服务主体还可用于从 SQL 仓库访问 Azure 存储,请参阅 数据访问配置。
设置 Spark 属性以配置Azure凭据
可以设置 Spark 属性以配置Azure凭据以访问Azure存储。 凭据的作用范围可以限定为某个集群或笔记本。 同时使用群集访问控制和笔记本访问控制来保护对 Azure 存储的访问。 请参阅计算权限和使用 Databricks 笔记本进行协作。
若要设置 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.partner.microsoftonline.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.partner.microsoftonline.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 存储帐户访问密钥的密钥的名称。
步骤 4:访问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');
示例笔记本
使用 Microsoft Entra ID(即原 Azure Active Directory)服务主体的 ADLS OAuth 2.0 笔记本
Azure Data Lake Storage 已知问题
如果尝试访问通过 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 的已知问题 。
Azure Databricks 中用于存储和访问数据的已弃用模式
下面是已弃用的存储模式:
Databricks 不再建议将外部数据位置装载到 Databricks 文件系统。 请参阅在 Azure Databricks 上装载云对象存储。
Databricks 不再建议将凭据直通与 Azure Data Lake Storage 一起使用。 请参阅使用 Microsoft Entra ID 凭据直通访问 Azure Data Lake Storage(旧版)。