连接到 Azure Data Lake Storage Gen2 (ADLS Gen2) 外部位置

本页介绍如何连接到Azure Data Lake Storage Gen2(ADLS Gen2)外部位置。 完成此连接后,可以使用 Unity 目录控制对这些 ADLS Gen2 对象的访问。

若要连接到 ADLS Gen2 容器路径,需要两个 Unity 目录安全对象。 第一个是存储凭据,其指定了可用于访问 ADLS Gen2 容器的 Azure 托管标识。 需要此存储凭据作为第二个必需对象:外部 位置,用于定义 ADLS Gen2 存储位置的路径以及访问该位置所需的凭据。

要求

在 Azure Databricks 中:

  • 为 Unity Catalog 启用 Azure Databricks 工作区。
  • 与工作区关联的 Unity Catalog 元数据存储库的 CREATE STORAGE CREDENTIAL 权限。 默认情况下,帐户管理员和元存储管理员具有此权限。
  • CREATE EXTERNAL LOCATION 对 Unity Catalog 元存储和外部位置引用的存储凭据都具有权限。 默认情况下,元存储管理员和工作区管理员具有此权限。

在你的Azure帐户中:

  • ADLS Gen2 存储帐户和容器。 为了避免出口费用,它应与要从中访问数据的工作区位于同一区域。

    • 外部位置路径必须仅包含标准 ASCII 字符(字母 A-Za-z数字 0-9和常见符号,如 /,, _-

    • 用作外部位置的 Azure Data Lake Storage 存储帐户必须具有分层命名空间。

    • 不能将启用了不可变性(WORM - 写入一次,读取多次)策略的 Azure 存储容器用作外部存储位置。 Unity Catalog 需要在存储容器上拥有 DELETE 权限,而不可变策略会对此进行阻止。 有关不可变性策略的详细信息,请参阅 为容器配置不可变性策略

    • 如果存储帐户上禁用了公用网络访问,则必须启用 “允许 Azure 受信任的服务 ”选项,以允许 Azure Databricks 连接到存储帐户。 可以使用Azure CLI配置此设置:

      # Check current network rule set
      az storage account show --name <storage_account_name> --resource-group <resource_group_name> --query "networkRuleSet"
      
      # Set bypass for Azure Services
      az storage account update \
        --name <storage_account_name> \
        --resource-group <resource_group_name> \
        --bypass AzureServices
      
  • 在你的 Azure 订阅中为 Azure Databricks 创建访问连接器的权限。 为此,你必须是 Azure 资源组的 ContributorOwner

  • 修改存储帐户的访问策略的权限。 为此,你必须是存储帐户上具有 User Access Administrator Azure RBAC 角色的所有者或用户。

创建访问 ADLS Gen2 的存储凭据

若要创建用于访问 ADLS Gen2 容器的存储凭据,请先使用托管标识为Azure Databricks创建访问连接器,然后授予托管标识对存储帐户的访问权限。

步骤 1:为 Azure Databricks 创建 访问连接器

用于Azure Databricks的访问连接器是第一方Azure资源,可用于将托管标识连接到Azure Databricks帐户。 Azure Databricks 的每个访问连接器都可以包括系统分配的托管标识、一个或多个用户分配的托管标识,或同时包含这两者。

  1. 以资源组的参与者或所有者身份登录 Azure 门户。

  2. 单击“ + 创建 ”或 “创建资源”。

  3. 搜索 Access Connector for Azure Databricks 并选择它。

  4. 单击 “创建”

  5. 在“基本信息”选项卡上,接受、选择或输入以下字段的值:

    • 订阅:这是将在其中创建访问连接器的 Azure 订阅。 默认值为当前使用的Azure订阅。 它可以是租户中的任何订阅。
    • Resource group:这是访问连接器将在其中创建的Azure资源组。
    • 名称:输入表明连接器用途的名称。
    • Region:这应与您要连接的存储帐户所在的区域相同。
  6. 单击 下一步,输入标记,然后单击 下一步

  7. 在“托管标识”选项卡上,按如下所示创建托管标识:

    • 若要使用系统分配的托管标识,请将 “状态 ”设置为 “开”。
    • 若要添加用户分配的托管标识,请单击 + 添加 并选择一个或多个用户分配的托管标识。

    为访问连接器配置托管身份。

  8. 单击 审阅 + 创建

  9. 查看配置设置,然后单击“ 创建”。

  10. 部署完成后,单击“转到资源”。

  11. 记下“资源 ID”。

    资源 ID 的格式为:

    /subscriptions/12f34567-8ace-9c10-111c-aea8eba12345c/resourceGroups/<resource-group>/providers/Microsoft.Databricks/accessConnectors/<connector-name>
    

步骤 2:授予托管标识对存储帐户的访问权限

若要授予此步骤中的权限,必须在存储帐户上具有 OwnerUser Access Administrator Azure RBAC 角色。

在授予托管标识对存储帐户和容器的访问权限时,您可以选择以下选项:

  • 使用 Storage Blob Data Contributor 角色授予对整个存储帐户的读取和写入访问权限。
  • 使用 Storage Blob Delegator 角色向存储帐户授予更有限的角色,并使用 Storage Blob Data Contributor 角色读取和写入对特定容器的访问权限。

以下说明假定你在存储帐户上授予 Storage Blob Data Contributor 角色,但你可以根据需要替换其他选项:

  1. 登录到 Azure Data Lake Storage 帐户。
  2. 转到“访问控制(IAM)”,单击“+ 添加”,然后选择“添加角色分配”。
  3. 选择 Storage Blob 数据参与者角色,然后单击 Next
  4. 将访问权限分配到下,选择托管身份(Managed Identity)
  5. 单击+选择成员,然后选择Azure Databricks 的访问连接器用户分配的托管标识
  6. 搜索连接器名称或用户分配的标识,将其选中,然后单击“查看并分配”。

步骤 3:向托管身份授予对文件事件的访问权限

为您的托管标识授予对文件事件的访问权限后,Azure Databricks 就可以订阅由云提供商发出的文件事件通知。 这使得文件处理更高效。 有关详细信息,请参阅 文件事件的外部位置设置

若要在此步骤中授予权限,必须在存储帐户上具有所有者或用户访问管理员 Azure RBAC 角色。

  1. 登录到 Azure Data Lake Storage 帐户。
  2. 转到“访问控制(IAM)”,单击“+ 添加”,然后选择“添加角色分配”。
  3. 选择“存储队列数据参与者”角色并单击“下一步”
  4. 将访问权限分配到下,选择托管身份(Managed Identity)
  5. 单击+选择成员,然后选择Azure Databricks 的访问连接器用户分配的托管标识
  6. 搜索连接器名称或用户分配的标识,将其选中,然后单击“查看并分配”。

步骤 4:授予 Azure Databricks 代表你配置文件事件的权限

注释

此步骤可选,但强烈建议执行。 如果不授予 Azure Databricks 代表你配置文件事件的访问权限,则必须为每个位置手动配置文件事件,并且你还将限制对 Databricks 将来可能发布的关键功能的访问权限。 有关文件事件的详细信息,请参阅 为外部位置设置文件事件

通过此步骤,Azure Databricks 可自动设置文件事件。 若要授予此步骤中的权限,必须在托管标识和 Azure Data Lake Storage 帐户所属的资源组上拥有所有者或用户访问管理员 Azure RBAC 角色。

  1. 按照步骤 3 中的说明操作 :授予托管标识对文件事件的访问权限 ,并将 存储帐户参与者 分配给托管标识。

    此角色不会替换在此页上的步骤 2 或 3 中授予的角色,而是作为对这些角色的补充。

  2. 导航到 Azure Data Lake Storage 帐户位于的 Azure 资源组。

  3. 转到“访问控制(IAM)”,单击“+ 添加”,然后选择“添加角色分配”。

  4. 选择 EventGrid EventSubscription 参与者角色,然后单击“下一步”

  5. 将访问权限分配到下,选择托管身份(Managed Identity)

  6. 单击+选择成员,然后选择Azure Databricks 的访问连接器用户分配的托管标识

  7. 搜索连接器名称或用户分配的标识,将其选中,然后单击“查看并分配”。

步骤 5:在 Databricks 中创建存储凭据

创建具有托管标识的访问连接器并向其授予对存储帐户的权限后,可以在Azure Databricks中创建存储凭据。

  1. 以拥有元存储 CREATE STORAGE CREDENTIAL 权限的用户身份登录到已启用 Unity Catalog 的 Azure Databricks 工作区。

  2. 在边栏中,单击 “数据”图标。目录

  3. 单击“ 添加”或“加号”图标,然后单击“ 创建凭据”。

  4. 选择“Azure 托管标识”作为“凭据类型”。

  5. 输入 存储凭据名称和 可选注释。

  6. 输入 访问连接器 ID在步骤 1 中记录的资源 ID)。

    资源 ID 的格式为:

    /subscriptions/12f34567-8ace-9c10-111c-aea8eba12345c/resourceGroups/<resource-group>/providers/Microsoft.Databricks/accessConnectors/<connector-name>
    
  7. (可选)如果使用用户分配的托管标识创建了访问连接器,请输入 托管标识 ID (托管标识的资源 ID)。

  8. (可选)如果希望用户对使用此存储凭据的外部位置具有只读访问权限,请单击“ 高级选项 ”,然后选择“ 限制”以只读使用。 有关详细信息,请参阅将存储凭据标记为只读

  9. 单击 “创建”

  10. (可选)将存储凭据绑定到特定工作区。

    默认情况下,任何特权用户都可以在附加到元存储的任何工作区上使用存储凭据。 如果只想允许从特定工作区进行访问,请转到“工作区”选项卡并分配工作区。 请参阅 向特定工作区分配存储凭据

现在可以 创建引用存储凭据的外部位置

为 ADLS Gen2 容器创建外部位置

本部分介绍如何使用目录资源管理器或 SQL 创建外部位置。 它假定你已有一个允许访问 ADLS Gen2 容器的存储凭据。 如果没有存储凭据,请按照 创建访问 ADLS Gen2 的存储凭据中的步骤操作。

选项 1:使用目录资源管理器手动创建外部位置

可以使用目录资源管理器手动创建外部位置。

要创建外部位置,请执行以下操作:

  1. 登录到一个连接到元数据存储的工作区。

  2. 在边栏中,单击 “数据”图标。目录

  3. 单击 “添加”或“加号”图标,然后单击“ 创建外部位置”。

  4. 输入外部位置名称

  5. Storage 类型下,选择 Azure

  6. URL 下,输入 ADLS Gen2 容器路径。 例如,abfss://mycontainer@mystorageaccount.dfs.core.chinacloudapi.cn/<path>

  7. “存储凭据”下,选择授予对外部位置访问权限的存储凭据。

  8. (可选)如果希望用户对外部位置具有只读访问权限,请单击“ 高级选项 ”,然后选择“ 限制”以只读使用。 有关详细信息,请参阅将外部位置标记为只读

  9. (可选)如果外部位置用于 Hive 元存储联合目录,请单击高级选项,然后启用回退模式

    请参阅在外部位置启用回退模式

  10. (可选)若要允许订阅外部位置上的更改通知,请单击“ 高级选项 ”并选择“ 启用文件事件”。

    有关详细信息,请参阅 为外部位置设置文件事件

  11. 单击 “创建”

  12. (可选)将外部位置绑定到特定工作区。

    默认情况下,任何特权用户都可以使用连接到元存储的任何工作空间上的外部位置。 如果只想允许从特定工作区进行访问,请转到“工作区”选项卡并分配工作区。 请参阅 向特定工作区分配外部位置

  13. 转到“权限”选项卡,授予使用外部位置的权限。

    要允许任何人使用该外部位置,必须授予权限:

    • 要使用外部位置将托管存储位置添加到元存储、目录或架构,请授予 CREATE MANAGED LOCATION 权限。
    • 要创建外部表或卷,请授予 CREATE EXTERNAL TABLECREATE EXTERNAL VOLUME

    执行以下步骤:

    1. 单击授权
    2. “授权”<external location>对话框中,选择“主体”字段中的用户、组或服务主体,然后选择您想授予的权限。
    3. 单击授权

选项 2:使用 SQL 创建外部位置

若要使用 SQL 创建外部位置,请在笔记本或 SQL 查询编辑器中运行以下命令。 替换占位符值。 有关所需的权限和先决条件,请参阅 要求

  • <location-name>:外部位置的名称。 如果 location_name 包含特殊字符,例如连字符 (-),则它必须用反引号 (` `) 引起来。 请参阅名称
  • <container-path>:云租户中此外部位置授予访问权限的路径。 例如,abfss://mycontainer@mystorageaccount.dfs.core.chinacloudapi.cn/
  • <storage-credential-name>:授权读取和写入容器的存储凭据的名称。 如果存储凭据名称中包含特殊字符,例如连字符 (-),则必须用反引号 (` `) 将其包围起来。
CREATE EXTERNAL LOCATION [IF NOT EXISTS] `<location-name>`
URL '<container-path>'
WITH ([STORAGE] CREDENTIAL `<storage-credential-name>`)
[COMMENT '<comment-string>'];

如果要限制对帐户中特定工作区(也称为工作区绑定或外部位置隔离)的外部位置访问,请参阅 向特定工作区分配外部位置

验证连接

若要验证是否已成功创建外部位置,请尝试从外部位置读取文件。 例如,假设你有一个外部位置 abfss://mycontainer@mystorageaccount.dfs.core.chinacloudapi.cn/ ,其中包含名为 example.csv 的 CSV 文件。 若要从 abfss://mycontainer@mystorageaccount.dfs.core.chinacloudapi.cn/example.csv 文件读取,请执行以下步骤:

  1. 在边栏中,单击 “笔记本”图标。工作区

  2. 单击“ 创建”,然后选择 “笔记本”。

  3. 运行以下Python代码片段:

    display(dbutils.fs.ls('abfss://mycontainer@mystorageaccount.dfs.core.chinacloudapi.cn/'))
    

    这会在外部位置显示文件路径的列表。 在此示例中, abfss://mycontainer@mystorageaccount.dfs.core.chinacloudapi.cn/example.csv 该文件显示在输出中。

  4. 若要在外部位置读取特定文件,请运行以下Python代码片段:

    spark.read.format("csv") \
       .option("header", "true") \
       .option("delimiter", ";") \
       .load('abfss://mycontainer@mystorageaccount.dfs.core.chinacloudapi.cn/example.csv') \
       .display()
    

    这将显示 abfss://mycontainer@mystorageaccount.dfs.core.chinacloudapi.cn/example.csv 文件中的数据。

后续步骤