连接到 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 存储。
注意
- 旧版 Windows Azure 存储 Blob 驱动程序 (WASB) 已弃用。 与 WASB 相比,ABFS 具有许多优势。 请参阅有关 ABFS 的 Azure 文档。 有关使用旧版 WASB 驱动程序的文档,请参阅使用 WASB(旧版)连接到 Azure Blob 存储。
- Azure 已宣布 Azure Data Lake Storage Gen1 即将停用。 Azure Databricks 建议将所有数据从 Azure Data Lake Storage Gen1 迁移到 Azure Data Lake Storage Gen2。 如果尚未迁移,请参阅从 Azure Databricks 访问 Azure Data Lake Storage Gen1。
使用 Azure 凭据连接到 Azure Data Lake Storage Gen2 或 Blob 存储
以下凭据可用于访问 Azure Data Lake Storage Gen2 或 Blob 存储:
OAuth 2.0 和 Microsoft Entra ID 服务主体:Databricks 建议使用 Microsoft Entra ID 服务主体连接到 Azure Data Lake Storage Gen2。 若要创建 Microsoft Entra ID 服务主体并为其提供对 Azure 存储帐户的访问权限,请参阅使用服务主体和 Microsoft Entra ID (Azure Active Directory) 访问存储。
若要创建 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 存储。 若要创建机密范围,请参阅 “管理机密范围”。
设置 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.windows.net OAuth
spark.hadoop.fs.azure.account.oauth.provider.type.<storage-account>.dfs.core.windows.net org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider
spark.hadoop.fs.azure.account.oauth2.client.id.<storage-account>.dfs.core.windows.net <application-id>
spark.hadoop.fs.azure.account.oauth2.client.secret.<storage-account>.dfs.core.windows.net {{secrets/<secret-scope>/<service-credential-key>}}
spark.hadoop.fs.azure.account.oauth2.client.endpoint.<storage-account>.dfs.core.windows.net https://login.microsoftonline.com/<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.windows.net", "OAuth")
spark.conf.set("fs.azure.account.oauth.provider.type.<storage-account>.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
spark.conf.set("fs.azure.account.oauth2.client.id.<storage-account>.dfs.core.windows.net", "<application-id>")
spark.conf.set("fs.azure.account.oauth2.client.secret.<storage-account>.dfs.core.windows.net", service_credential)
spark.conf.set("fs.azure.account.oauth2.client.endpoint.<storage-account>.dfs.core.windows.net", "https://login.microsoftonline.com/<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.windows.net", "SAS")
spark.conf.set("fs.azure.sas.token.provider.type.<storage-account>.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.sas.FixedSASTokenProvider")
spark.conf.set("fs.azure.sas.fixed.token.<storage-account>.dfs.core.windows.net", 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.windows.net",
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.windows.net/<path-to-data>")
dbutils.fs.ls("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/<path-to-data>")
CREATE TABLE <database-name>.<table-name>;
COPY INTO <database-name>.<table-name>
FROM 'abfss://container@storageAccount.dfs.core.windows.net/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 门户创建的。
请参阅 Microsoft 文档中的 Azure Data Lake Storage Gen2 的已知问题。
用于存储和访问 Azure Databricks 中数据的弃用模式
下面是已弃用的存储模式:
Databricks 不再建议将外部数据位置装载到 Databricks 文件系统。 请参阅在 Azure Databricks 上装载云对象存储。
Databricks 不再建议将凭据直通用于 Azure Data Lake Storage Gen2。 请参阅使用 Microsoft Entra ID 凭据直通访问 Azure Data Lake Storage(旧版)。