教程:连接到 Azure Data Lake Storage Gen2

注意

本文介绍用于配置对 Azure Data Lake Storage Gen2 的访问的旧模式。 Databricks 建议使用 Unity Catalog。 请参阅使用 Unity 目录创建 Unity 目录元存储并连接到云对象存储和服务。

本教程指导你完成使用 OAuth 2.0 和 Microsoft Entra ID 服务主体从 Azure Databricks 连接到 Azure Data Lake Storage Gen2 所要执行的所有步骤。

要求

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

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

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

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

  1. 登录 Azure 门户

    注意

    要使用的门户根据 Microsoft Entra ID 应用程序是在 Azure 公有云中运行还是在国家云或主权云中运行而异。 有关详细信息,请参阅国家云

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

  3. 搜索并选择 <Microsoft Entra ID

  4. 在“管理”中,单击“应用注册”“新建注册”。

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

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

  7. 单击“注册”。

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

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

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

    新建客户端机密

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

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

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

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

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

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

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

  1. 在 Azure 门户中,转到“存储帐户”服务。
  2. 选择要使用的 Azure 存储帐户。
  3. 单击“访问控制(IAM)”。
  4. 单击“+ 添加”,然后从下拉菜单中选择“添加角色分配” 。
  5. 将“选择”字段设置为在步骤 1 中创建的 Microsoft Entra ID 应用程序名称,并将“角色”设置为“存储 Blob 数据参与者”。
  6. 单击“保存” 。

步骤 4:将客户端机密添加到 Azure 密钥保管库

可以将步骤 1 中创建的客户端机密存储在 Azure 密钥保管库中。

  1. 在 Azure 门户中,转到“密钥保管库”服务。
  2. 选择要使用的 Azure Key Vault。
  3. 在 Key Vault 设置页中,选择“机密”。
  4. 单击“+ 生成/导入”。
  5. 在“上传选项”中,选择“手动”。
  6. 对于“名称”,请输入机密的名称。 机密名称在 Key Vault 中必须是唯一的。
  7. 对于“值”,请粘贴在步骤 4 中存储的客户端机密。
  8. 单击 “创建”

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

  1. 在 Azure 门户中,转到 Azure 密钥保管库实例。
    1. 在“设置”,选择“访问配置”选项卡。

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

      注意

      创建 Azure Key Vault 支持的机密范围角色会使用密钥保管库访问策略授予对 Azure Databricks 服务的应用 ID 的“获取”和“列表”权限。 Azure Databricks 不支持 Azure 基于角色的访问控制权限模型。

    3. 设置下选择网络

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

      在“例外”下,选中“允许受信任的 Microsoft 服务跳过此防火墙”。

      注意

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

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

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

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

    创建范围

  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 Gen2

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

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

  2. 运行以下 python 代码并如下所示进行替换,以连接到 Azure Data Lake Storage Gen2。

    service_credential = dbutils.secrets.get(scope="<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")
    

    替换

    • <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 Gen2 帐户。

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

如果你在 Azure Data Lake Storage Gen2 上配置防火墙,必须配置网络设置以允许 Azure Databricks 工作区连接到 Azure Data Lake Storage Gen2。 首先,确保按照在 Azure 虚拟网络中部署 Azure Databricks(VNet 注入),将 Azure Databricks 工作区部署在你自己的虚拟网络中。 然后,可以配置专用终结点或者从虚拟网络访问,以允许从子网连接到 Azure Data Lake Storage Gen2 帐户。

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

使用专用终结点授予访问权限

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

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

从虚拟网络授予访问权限

使用虚拟网络服务终结点可以保护关键的 Azure 服务资源,只允许你在自己的虚拟网络中对其进行访问。 可以在用于 Azure Databricks 工作区的 VNet 中为 Azure 存储启用服务终结点。

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

  1. 以在 Azure Data Lake Storage Gen2 帐户中具有存储帐户参与者角色的用户身份登录到 Azure 门户。
  2. 导航到你的 Azure 存储帐户,然后转到“网络”选项卡。
  3. 检查是否已选择允许从选定的虚拟网络和 IP 地址进行访问。
  4. 在“虚拟网络”下,选择“添加现有虚拟网络”。
  5. 在边侧面板中的“订阅”下,选择你的虚拟网络所在的订阅。
  6. 在“虚拟网络”下,选择部署了你的 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 中的机密。

资源