注意
本文介绍用于配置对 Azure Data Lake Storage 的访问的旧模式。 Databricks 建议使用 Unity Catalog。 请参阅创建 Unity Catalog 元存储和使用 Unity Catalog 连接到云对象存储和服务。
本教程指导您使用 OAuth 2.0 和 Microsoft Entra ID 服务主体,完成从 Azure Databricks 连接到 Azure Data Lake Storage 的所有步骤。
在开始本教程之前,完成以下任务:
- 创建 Azure Databricks 工作区。 参阅快速入门:创建 Azure Databricks 工作区
- 创建 Azure Data Lake Storage 存储帐户。 请参阅 快速入门:创建 Azure Data Lake Storage 存储帐户。
- 创建 Azure 密钥保管库。 参阅快速入门:创建 Azure 密钥保管库
若要使用服务主体连接到 Azure Data Lake Storage,管理员用户必须创建新的Microsoft Entra ID 应用程序。 如果你已有可用的 Microsoft Entra ID 服务主体,请跳到步骤 2:为服务主体创建客户端机密。
若要创建 Microsoft Entra ID 服务主体,请按照以下说明操作:
登录 Azure 门户。
注意
要使用的门户根据 Microsoft Entra ID 应用程序是在 Azure 公有云中运行还是在国家云或主权云中运行而异。 有关详细信息,请参阅国家云。
如果有权访问多个租户、订阅或目录,请单击顶部菜单中的“目录 + 订阅”(目录包含筛选器)图标,以切换到要预配服务主体的目录。
搜索并选择 Microsoft Entra ID。
在“管理”中,单击“应用注册”“新建注册”。
对于“名称”,请输入应用程序的名称。
在“支持的帐户类型”部分中,选择“仅组织目录中的帐户(单一租户)”。
单击“注册”。
在“管理”中,单击“证书和机密”。
在“客户端密码”选项卡上,单击“新建客户端密码” 。
在“添加客户端机密”窗格中的“说明”,输入客户端机密的说明。
对于“过期”,选择客户端机密的过期时间段,然后单击“添加”。
复制客户端密码的“值”并将其存储在安全位置,因为此客户端密码是应用程序的密码。
在应用程序页的“概述”页上的“概要”部分中,复制以下值:
- 应用程序(客户端) ID
- 目录(租户)ID
通过为服务主体分配角色来授予对存储资源的访问权限。 在本教程中,你将向 Azure Data Lake Storage 帐户上的服务主体分配存储 Blob 数据参与者角色。 可能需要根据特定要求分配其他角色。
在 Azure 门户中,转到“存储帐户”服务。
选择要使用的 Azure 存储帐户。
单击“访问控制(IAM)”。
单击“+ 添加”,然后从下拉菜单中选择“添加角色分配” 。
将“选择”字段设置为在步骤 1 中创建的 Microsoft Entra ID 应用程序名称,并将“角色”设置为“存储 Blob 数据参与者”。
单击“保存” 。
可以将步骤 1 中创建的客户端机密存储在 Azure 密钥保管库中。
在 Azure 门户中,转到“密钥保管库”服务。
选择要使用的 Azure Key Vault。
在 Key Vault 设置页中,选择“机密”。
单击“+ 生成/导入”。
在“上传选项”中,选择“手动”。
对于“名称”,请输入机密的名称。 机密名称在 Key Vault 中必须是唯一的。
对于“值”,请粘贴在步骤 4 中存储的客户端机密。
单击 “创建” 。
在 Azure 门户中,转到 Azure Key Vault 实例。
在“设置”下选择“访问配置”选项卡。
将 权限模型 设置为 保管库访问策略。
注意
创建 Azure Key Vault 支持的机密范围角色会使用密钥保管库访问策略授予对 Azure Databricks 服务的应用 ID 的“获取”和“列表”权限。 Azure Databricks 不支持 Azure 基于角色的访问控制权限模型。
在“设置”下选择“网络” 。
在“防火墙和虚拟网络”中,将“允许的访问来源:”设置为“允许从特定虚拟网络和 IP 地址访问”。
在“例外”下,选中 允许受信任的 Azure 服务绕过此防火墙。
注意
还可以将“允许的访问来源”设置为“允许来自所有网络的公共访问”。
若要引用存储在 Azure Key Vault 中的客户端机密,可以在 Azure Databricks 中创建一个由 Azure Key Vault 支持的机密范围。
转到
https://<databricks-instance>#secrets/createScope
。 此 URL 区分大小写;createScope
中的范围必须大写。输入机密范围的名称。 机密范围名称不区分大小写。
使用“管理主体”下拉菜单指定是所有用户都对此机密范围拥有 权限,还是仅机密范围的创建者拥有该权限。
输入“DNS 名称”(例如 )和“资源 ID”,例如:
/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/databricks-rg/providers/Microsoft.KeyVault/vaults/databricksKV
这些属性可从 Azure 门户中 Azure Key Vault 的 “设置 > 属性 ”选项卡获取。
单击“创建”按钮。
现在可以使用 OAuth 2.0 和 Microsoft Entra ID 应用程序服务主体从 Azure Databricks 笔记本进行身份验证,以便安全地访问 Azure 存储帐户中的数据。
导航到 Azure Databricks 工作区并创建一个新的 python 笔记本。
运行以下 Python 代码,并使用以下替换项连接到 Azure Data Lake Storage。
service_credential = dbutils.secrets.get(scope="<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")
替换
- 将
<scope>
替换为步骤 5 中的机密范围名称。 - 将
<service-credential-key>
替换为包含客户端密码的密钥的名称。 - 将
<storage-account>
替换为 Azure 存储帐户的名称。 -
<application-id>
,包含 Microsoft Entra ID 应用程序的应用程序(客户端)ID。 -
<directory-id>
,包含 Microsoft Entra ID 应用程序的目录(租户)ID。
现已成功将 Azure Databricks 工作区连接到 Azure Data Lake Storage 帐户。
- 将
如果在 Azure Data Lake Storage 上配置防火墙,则必须配置网络设置,以允许 Azure Databricks 工作区连接到 Azure Data Lake Storage。 首先,确保按照在 Azure 虚拟网络中部署 Azure Databricks(VNet 注入),将 Azure Databricks 工作区部署在你自己的虚拟网络中。 然后,可以配置 专用终结点 或 从虚拟网络进行访问 ,以允许从子网连接到 Azure Data Lake Storage 帐户。
可以使用 Azure Data Lake Storage 的专用终结点,以便 Azure Databricks 工作区通过专用链接安全地访问数据。
若要使用 Azure 门户创建专用终结点,请参阅教程:使用 Azure 专用终结点连接到存储帐户。 确保在部署 Azure Databricks 工作区的同一虚拟网络中创建专用终结点。
使用虚拟网络服务终结点可以保护关键的 Azure 服务资源,只允许你在自己的虚拟网络中对其进行访问。 可以在用于 Azure Databricks 工作区的 VNet 中为 Azure 存储启用服务终结点。
有关详细信息,包括 Azure CLI 和 PowerShell 说明,请参阅从虚拟网络授予访问权限。
以在 Azure Data Lake Storage 帐户中具有存储帐户参与者角色的用户身份登录到 Azure 门户。
导航到你的 Azure 存储帐户,然后转到“网络”选项卡。
检查是否已选择允许从选定的虚拟网络和 IP 地址进行访问。
在“虚拟网络”下,选择“添加现有虚拟网络”。
在边侧面板中的“订阅”下,选择你的虚拟网络所在的订阅。
在“虚拟网络”下,选择部署了你的 Azure Databricks 工作区的虚拟网络。
在“子网”下,选择“全选”。
单击“启用”。
单击“保存”应用所做的更改。
此错误可能意味着:
- 代码中引用的 Databricks 支持范围无效。
查看本文的步骤 4 中的机密名称。
错误:com.databricks.common.client.DatabricksServiceHttpClientException: INVALID_STATE: Databricks 无法访问密钥保管库
此错误可能意味着:
- 代码中引用的 Databricks 支持范围无效。 或者 Key Vault 中存储的机密已过期。
查看步骤 3,确保你的 Azure Key Vault 机密有效。 查看本文的步骤 4 中的机密名称。
此错误可能意味着:
- 服务主体的客户端机密密钥已过期。
按照本文中的步骤 2 创建新的客户端机密,并更新 Azure Key Vault 中的机密。