教程:连接到Azure Data Lake Storage

重要

本文档已停用,可能不会更新。

本文介绍用于配置对Azure Data Lake Storage的访问的旧模式。 Databricks 建议将 Unity 目录与Azure托管标识配合使用。 请参阅 使用 Unity 目录中的Azure托管标识访问存储

本教程将指导完成将 OAuth 2.0 与 Microsoft Entra ID 服务主体配合使用从 Azure Databricks 连接到Azure Data Lake Storage所需的所有步骤。

要求

在开始本教程之前,完成以下任务:

步骤 1:创建 Microsoft Entra ID 服务主体

若要使用服务主体连接到Azure Data Lake Storage,管理员用户必须创建新的Microsoft Entra ID应用程序。 如果已有可用的Microsoft Entra ID服务主体,请跳到 Step 2:为服务主体创建客户端密码

若要创建 Microsoft Entra ID 服务主体,请按照以下步骤操作:

  1. 登录到 Azure 门户

    注释

    要使用的门户会有所不同,具体取决于Microsoft Entra ID应用程序是在公有云Azure还是在国家或主权云中运行。 有关详细信息,请参阅国家云

  2. 如果有权访问多个租户、订阅或目录,请单击顶部菜单中的“目录 + 订阅”(目录包含筛选器)图标,以切换到要预配服务主体的目录。

  3. 搜索并选择 Microsoft Entra ID

  4. Manage 中,单击App registrations >新注册

  5. 对于“名称”,请输入应用程序的名称。

  6. 在“支持的帐户类型”部分中,选择“仅组织目录中的帐户(单一租户)”。

  7. 单击“注册”。

步骤 2:为服务主体创建客户端机密

  1. 在“管理”中,单击“证书和机密”

  2. 在“客户端密码”选项卡上,单击“新建客户端密码” 。

    新建客户端机密

  3. 在“添加客户端机密”窗格中的“说明”,输入客户端机密的说明。

  4. 对于“过期”,选择客户端密钥的过期时间段,然后点击“添加”按钮。

  5. 复制客户端密码的“值”并将其存储在安全位置,因为此客户端密码是应用程序的密码。

  6. 在应用程序页的“概述”页上的“概要”部分中,复制以下值:

    • 应用程序(客户端)ID
    • 目录(租户)ID

步骤 3:授予服务主体对Azure Data Lake Storage的访问权限

通过为服务主体分配角色来授予对存储资源的访问权限。 在本教程中,将 Storage Blob 数据参与者分配给Azure Data Lake Storage帐户上的服务主体。 可能需要根据特定要求分配其他角色。

  1. 在Azure门户中,转到 Storage 帐户服务。

  2. 选择要使用的Azure存储帐户。

  3. 单击Access Control (IAM)

  4. 单击“+ 添加”,然后从下拉菜单中选择“添加角色分配” 。

  5. Select 字段设置为在步骤 1 中创建的Microsoft Entra ID应用程序名称,并将 Role 设置为 Storage Blob 数据参与者

  6. 单击“ 保存”。

步骤 4:将客户端密码添加到Azure Key Vault

可以在Azure Key Vault中存储步骤 1 中的客户端密码。

  1. 在Azure门户中,转到 Key vault 服务。

  2. 选择要使用的Azure Key Vault。

  3. 在Key Vault设置页上,选择Secrets

  4. 单击“+ 生成/导入”。

  5. 在“上传选项”中,选择“手动”。

  6. 对于“名称”,请输入密钥的名称。 机密名称在Key Vault中必须唯一。

  7. 对于,请粘贴在步骤 1 中存储的客户端机密。

  8. 单击 “创建”

步骤 5:为Azure Databricks配置Azure密钥保管库实例

  1. 在Azure Portal中,转到Azure密钥保管库实例。

    1. 在“设置”下选择“访问配置”选项卡。

    2. 权限模型 设置为 保管库访问策略

      注释

      创建一个由Azure Key Vault支持的机密作用域角色,将通过密钥保管库访问策略授予Azure Databricks服务的应用程序ID获取列出权限。 Azure Databricks不支持Azure基于角色的访问控制权限模型。

    3. 设置下选择网络

    4. 在“防火墙和虚拟网络”中,将“允许的访问来源”设置为“允许从特定虚拟网络和 IP 地址进行公众访问”。

      Exception 下,检查 允许受信任的 Azure 服务绕过此防火墙

      注释

      还可以将“允许的访问来源”设置为“允许来自所有网络的公共访问”。

步骤 6:在Azure Databricks工作区中创建Azure Key Vault支持的机密范围

若要引用存储在Azure Key Vault中的客户端机密,可以在Azure Databricks中创建Azure Key Vault支持的机密范围。

  1. 转到 https://<databricks-instance>#secrets/createScope。 此 URL 区分大小写;createScope 中的 "scope" 必须大写。

    创建范围

  2. 输入机密范围的名称。 机密范围名称不区分大小写。

  3. 使用“管理主体”下拉菜单指定是所有用户都对此机密范围拥有 权限,还是仅机密范围的创建者拥有该权限。

  4. 输入“DNS 名称”(例如 )和“资源 ID”,例如:

    /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/databricks-rg/providers/Microsoft.KeyVault/vaults/databricksKV
    

    这些属性可从您在 Azure 门户中的 Azure Key Vault 的 *设置属性 选项卡中获取。

  5. 单击“创建”按钮。

步骤 7:使用 python 连接到Azure Data Lake Storage

现在,您可以使用 OAuth 2.0 与 Microsoft Entra ID 应用程序服务主体配合,从 Azure Databricks 笔记本中安全地访问 Azure 存储帐户中的数据并进行身份验证。

  1. 导航到Azure Databricks工作区并创建新的 python 笔记本。

  2. 运行以下 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存储帐户。
    • Microsoft Entra ID应用程序的<application-id>应用程序(客户端)ID
    • 具有 Microsoft Entra ID 应用程序的 <directory-id>

    现已将Azure Databricks工作区成功连接到Azure Data Lake Storage帐户。

向Azure Databricks工作区授予对Azure Data Lake Storage的访问权限

如果在Azure Data Lake Storage上配置防火墙,则必须配置网络设置,以允许Azure Databricks工作区连接到Azure Data Lake Storage。 首先,请确保您的 Azure Databricks 工作区已按照 在 Azure 虚拟网络中部署 Azure Databricks (VNet 注入) 的说明部署在您自己的虚拟网络中。 然后,可以配置专用终结点从虚拟网络访问,以允许子网连接到 Azure 数据湖存储帐户。

如果使用无服务器计算(例如无服务器 SQL 仓库),则必须授予从无服务器计算平台到 Azure Data Lake Storage 的访问权限。 请参阅无服务器计算平面网络

通过专用终结点授予访问权限

可以使用 Azure Data Lake Storage 帐户的 专用终结点允许 Azure Databricks 工作区通过 专用链接安全地访问数据。

若要使用Azure Portal创建专用终结点,请参阅 Tutorial:使用Azure专用终结点连接到存储帐户。 请确保在部署Azure Databricks工作区的同一虚拟网络中创建专用终结点。

在虚拟网络中授予访问权限

虚拟网络服务终结点允许您将重要的 Azure 服务资源仅保护到您的虚拟网络。 在用于 Azure Databricks 工作区的 VNet 中,可以为 Azure 存储启用服务端点。

有关详细信息(包括有关 Azure CLI 和 PowerShell 的说明),请参阅授予虚拟网络访问权限

  1. 以具有Azure Data Lake Storage帐户上的存储帐户参与者角色的用户身份登录到Azure Portal。

  2. 导航到Azure Storage帐户,然后转到 Networking 选项卡。

  3. 检查是否已选择允许从选定的虚拟网络和 IP 地址进行访问。

  4. 在“虚拟网络”下,选择“添加现有虚拟网络”。

  5. 在边侧面板中的“订阅”下,选择你的虚拟网络所在的订阅。

  6. Virtual networks 下,选择部署Azure Databricks工作区的虚拟网络。

  7. 在“子网”下,选择“全选”。

  8. 单击“启用”。

  9. 选择保存以应用更改。

故障排除

错误:IllegalArgumentException: 在范围 KeyVaultScope 和密钥中找不到机密。

此错误可能意味着:

  • 代码中引用的由 Databricks 支持的范围无效。

请审核本文第 4 步中提到的机密名称。

错误:com.databricks.common.client.DatabricksServiceHttpClientException: INVALID_STATE: Databricks 无法访问密钥保管库

此错误可能意味着:

  • 代码中提到的由 Databricks 支持的范围无效。 或存储在Key Vault中的机密已过期。

查看步骤 3 以确保Azure Key Vault机密有效。 请审核本文第 4 步中提到的机密名称。

错误:ADAuthenticator$HttpException: HTTP 错误 401: 无法从 AzureAD 响应中获取令牌

此错误可能意味着:

  • 服务主体的客户端机密密钥已过期。

按照本文中的步骤 2 创建新的客户端密码,并在Azure Key Vault中更新机密。

资源