创建外部位置以将云存储连接到 Azure Databricks

本文介绍如何在 Unity 目录中配置外部位置对象,以控制从 Azure Databricks 对云存储的访问。

外部位置概述

外部位置将 存储凭据 与云对象存储容器相关联。 外部位置用于定义:

外部位置可以引用 Azure Data Lake Storage 存储容器、AWS S3 存储桶或 Cloudflare R2 存储桶中的存储。

下图表示单个云存储存储桶或容器的文件系统层次结构,其中四个外部位置共享一个存储凭据。

外部位置

外部位置创建概述

可以使用以下任一接口创建外部位置:

  1. 目录浏览器

    此选项提供图形 UI。 可以使用目录资源管理器创建引用的外部位置:Azure Data Lake Storage 容器、S3 存储桶(只读)、Cloudflare R2 存储桶和 DBFS 根(旧版)

  2. 笔记本或 Databricks SQL 查询中的 SQL 命令

  3. The Databricks CLI

  4. Terraform

本文介绍选项 1 和 2。

注意

将数据存储在 DBFS 根 存储位置是一种传统做法,Databricks 建议不要这样做。 但是,如果工作区确实将数据存储在 DBFS 根目录中,则可以创建一个外部位置,以使用 Unity 目录控制对该数据的访问。 有关详细信息,请参阅为 DBFS 根目录中的数据创建外部位置(旧版)。

有关外部位置的使用以及存储凭据与外部位置之间的关系的详细信息,请参阅 使用 Unity 目录连接到云对象存储

开始之前

先决条件

  • 在 Azure Databricks 中创建外部位置对象之前,必须创建要用作外部位置的 Azure Data Lake Storage 容器、AWS S3 存储桶或 Cloudflare R2 存储桶。

    • 用作外部位置的 Azure Data Lake Storage 存储帐户必须具有分层命名空间。
    • S3 存储桶名称不能使用点表示法(例如, incorrect.bucket.name.notation)。 有关更多存储桶命名指南,请参阅 AWS 存储桶命名规则

    • 存储桶不能附加 Amazon S3 访问控制列表。

权限要求

  • 你必须对元存储和外部位置中引用的存储凭据拥有 CREATE EXTERNAL LOCATION 权限。 默认情况下,元存储管理员对元存储拥有 CREATE EXTERNAL LOCATION 权限。
  • 如果要为 DBFS 根存储位置创建外部位置,系统可以为你创建存储凭据,但必须是工作区管理员。有关详细信息,请参阅 为 DBFS 根目录中的数据创建外部位置(旧版)

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

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

权限和先决条件:请参阅准备工作

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

  1. 登录到已附加到元存储的工作区。

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

  3. 可以在快速访问页中单击外部数据>按钮,转到外部位置选项卡,然后单击创建位置

  4. 输入外部位置名称

  5. 选择 存储类型Azure Data Lake StorageS3(只读)R2DBFS 根

    将数据存储在 DBFS 根目录中是一种未经建议的旧做法。 有关详细信息,请参阅为 DBFS 根目录中的数据创建外部位置(旧版)。

  6. URL 下,输入或选择外部位置的路径。

    对于 Azure Data Lake Storage、S3 和 R2,有以下选项:

    • 要从现有 DBFS 装载点复制容器路径,请单击从 DBFS 复制

    • 如果不从现有装入点复制,请使用 URL 字段输入要用作外部位置的容器或存储桶路径。

      例如 abfss://my-container-name@my-storage-account.dfs.core.windows.net/<path>r2://my-bucket@my-account-id.r2.cloudflarestorage.com/<path>

    对于 DBFS 根目录:

    • 系统将子路径填充到 DBFS 根存储位置。 如果你是工作区管理员,则系统还会为你创建存储凭据。

    请参阅 在 DBFS 根目录(旧版)中创建数据的外部位置

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

    注意

    如果外部位置用于 DBFS 根,并且你是工作区管理员,则系统会为你创建存储凭据,你无需选择凭据。

    如果没有存储凭据,则可以创建一个:

    1. 存储凭据下拉列表中,选择 + 创建新存储凭据

    2. 输入的凭据信息取决于存储类型:

      对于 Azure Data Lake Storage,输入访问连接器 ID 和(可选)用户分配的托管标识,该标识授予对存储位置的访问权限。 请参阅 创建访问 Azure Data Lake Storage 的存储凭据

      对于 Cloudflare API 令牌,输入 Cloudflare 帐户、访问密钥 ID 和机密访问密钥。 请参阅 创建用于连接到 Cloudflare R2 的存储凭据

      对于 AWS S3,请输入提供存储位置访问权限的 IAM 角色 ARN。 请参阅创建用于连接到 AWS S3 的存储凭据(只读)。

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

    引用 AWS S3 路径的外部位置本质上是只读的。

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

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

  10. (可选,仅适用于 AWS S3 位置)如果 S3 存储桶需要 SSE 加密,则可以配置加密算法,以允许 Unity 目录中的外部表和卷访问 S3 存储桶中的数据。

    有关说明,请参阅 在外部位置(仅 AWS S3)上配置加密算法

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

    有关详细信息,请参阅 (建议)为外部位置启用文件事件

  12. 单击“创建”

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

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

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

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

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

    • 若要创建外部表或卷,请授予 CREATE EXTERNAL TABLECREATE EXTERNAL VOLUME 权限。

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

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

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

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

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

(可选)将外部位置分配给特定工作区

默认情况下,可以从元存储中的所有工作区访问外部位置。 这意味着,如果用户已被授予该外部位置的权限(例如,READ FILES),则可以从附加到元存储的任何工作区行使该权限。 如果使用工作区来隔离用户数据访问,则可能需要仅允许从特定工作区访问外部位置。 此功能称为工作区绑定或外部位置隔离。

将外部位置绑定到特定工作区的典型用例包括:

  • 确保对包含生产数据的外部位置拥有 CREATE EXTERNAL TABLE 权限的数据工程师只能在生产工作区中的该位置创建外部表。
  • 确保对包含敏感数据的外部位置具有 READ FILES 特权的数据工程师只能使用特定工作区访问该数据。

有关如何按工作区限制其他类型的数据访问的详细信息,请参阅将目录访问仅限于特定工作区

重要说明

当针对外部位置行使权限时,将会引用工作区绑定。 例如,如果用户通过从 myWorkspace 工作区发出语句 CREATE TABLE myCat.mySch.myTable LOCATION 'abfss://my-container-name@storage-account-name.dfs.core.windows.net/finance' 创建外部表,则除了常规用户特权检查之外,还会执行以下工作区绑定检查:

  • 覆盖 'abfss://my-container-name@storage-account-name.dfs.core.windows.net/finance' 的外部位置是否绑定到 myWorkspace
  • 目录 myCat 是否绑定到具有 Read & Write 访问级别的 myWorkspace

如果外部位置随后与 myWorkspace 解除绑定,则外部表将继续运行。

此功能还允许从中央工作区填充目录,并使用目录绑定将其提供给其他工作区,而无需在其他工作区中提供外部位置。

将外部位置绑定到一个或多个工作区

要将外部位置分配到特定的工作区,可以使用目录资源管理器或 Databricks CLI。

所需权限:元存储管理员、外部位置所有者或外部位置上的 MANAGE

注意

元存储管理员可以使用目录资源管理器查看元存储中的所有外部位置,外部位置所有者可以查看他们在元存储中拥有的所有外部位置,无论外部位置是否已分配到当前工作区。 未分配给工作区的外部位置显示为灰色。

目录资源管理器

  1. 登录到链接到元存储的工作区。

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

  3. 快速访问页面上,单击外部数据>按钮转到外部位置选项卡。

  4. 选择外部位置,然后转到“工作区”选项卡

  5. 在“工作区”选项卡上,清除“所有工作区拥有访问权限”复选框。

    如果外部位置已绑定到一个或多个工作区,则此复选框已清除。

  6. 单击“分配到工作区”,然后输入或查找要分配的工作区

若要撤销访问权限,请转到“工作区”选项卡,选择该工作区,然后单击“撤销”。 若要允许从所有工作区进行访问,请选中“所有工作区都具有访问权限”复选框

CLI

向工作区分配外部位置时需使用两个 Databricks CLI 命令组并分两个步骤完成。

在以下示例中,将 <profile-name> 替换为 Azure Databricks 身份验证配置文件的名称。 它应包括个人访问令牌的值,以及生成个人访问令牌的工作区的工作区实例名称和工作区 ID。 请参阅 Azure Databricks 个人访问令牌身份验证

  1. 使用 external-locations 命令组的 update 命令将外部位置的 isolation mode 设置为 ISOLATED

    databricks external-locations update <my-location> \
    --isolation-mode ISOLATED \
    --profile <profile-name>
    

    对于附加到元存储的所有工作区,默认的 isolation-mode 设置为 OPEN

  2. 使用 workspace-bindings 命令组的 update-bindings 命令将工作区分配到外部位置:

    databricks workspace-bindings update-bindings external-location <my-location> \
    --json '{
      "add": [{"workspace_id": <workspace-id>}...],
      "remove": [{"workspace_id": <workspace-id>}...]
    }' --profile <profile-name>
    

    使用 "add""remove" 属性添加或删除工作区绑定。

    注意

    只读绑定 (BINDING_TYPE_READ_ONLY) 不适用于外部位置。 因此,没有理由为外部位置绑定设置binding_type

若要列出某个外部位置的所有工作区分配,请使用 workspace-bindings 命令组的 get-bindings 命令:

databricks workspace-bindings get-bindings external-location <my-location> \
--profile <profile-name>

另请参阅 REST API 参考中的工作区绑定

从工作区取消绑定外部位置

将外部位置绑定到一个或多个工作区中包含有关使用目录资源管理器或 workspace-bindings CLI 命令组撤销工作区对外部位置的访问权限的说明。

后续步骤