本文介绍如何在 Unity 目录中配置外部位置对象,以控制从 Azure Databricks 对云存储的访问。
外部位置概述
外部位置将 存储凭据 与云对象存储容器相关联。 外部位置用于定义:
- 托管表和卷的托管存储位置。 托管存储位置可以位于元存储、目录或架构级别。 请参阅在 Unity Catalog 中指定托管存储位置。 
- 外部表和外部卷的位置。 
外部位置可以引用 Azure Data Lake Storage 存储容器或 Cloudflare R2 存储桶中的存储。
下图显示了外部位置如何引用存储凭据和云存储位置。
               
              
            
在此图中:
- 每个外部位置引用一个存储凭据和一个云存储位置。
- 一个存储凭据可由多个外部位置引用。 
              存储凭据 1 授予对路径 bucket/tables/*下的所有内容的访问权限,因此 外部位置 A 和 外部位置 B 都引用它。
外部位置创建概述
可以使用以下任一接口创建外部位置:
- 
此选项提供图形 UI。 可以使用目录资源管理器创建外部引用位置:Azure Data Lake Storage 容器、Cloudflare R2 存储桶和 DBFS 根目录(旧版) 
本文介绍选项 1 和 2。
注意
将数据存储在 DBFS 根 存储位置是一种传统做法,Databricks 建议不要这样做。 但是,如果工作区确实将数据存储在 DBFS 根目录中,则可以创建一个外部位置,以使用 Unity 目录控制对该数据的访问。 有关详细信息,请参阅连接到 DBFS 根外部位置(旧版)。
有关外部位置的使用以及存储凭据与外部位置之间的关系的详细信息,请参阅 使用 Unity 目录连接到云对象存储。
在您开始之前
先决条件:
- 在 Azure Databricks 中创建外部位置对象之前,必须创建要用作外部位置的 Azure Data Lake Storage 存储容器或 Cloudflare R2 存储桶。 - 用作外部位置的 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
 
- 外部位置路径必须仅包含标准 ASCII 字符(字母 - A-Z、- a-z数字- 0-9和常见符号,如- /,,- _)- -。
- 必须在 Azure Databricks 中定义存储凭据,以访问云存储位置路径。 请参阅 创建用于连接到 Azure Data Lake Storage 的存储凭据,或 创建用于连接到 Cloudflare R2 的存储凭据。 
权限要求:
- 你必须对元存储和外部位置中引用的存储凭据拥有 CREATE EXTERNAL LOCATION权限。 默认情况下,元存储管理员对元存储具有CREATE EXTERNAL LOCATION。
- 如果要为 DBFS 根存储位置创建外部位置,系统可以为你创建存储凭据,但必须是工作区管理员。有关详细信息,请参阅 连接到 DBFS 根外部位置(旧版)
选项 1:使用目录资源管理器创建外部位置
可以使用目录资源管理器手动创建外部位置。
权限和先决条件:请参阅准备工作。
要创建外部位置,请执行以下操作:
- 登录到一个附加到元存储的工作区。 
- 在边栏中,单击 - 目录。 
- 在“快速访问”页中,单击“外部数据>”按钮,转到“外部位置”选项卡,然后单击“创建连接”。 
- 输入外部位置名称。 
- 选择 存储类型: Azure Data Lake Storage、 R2 或 DBFS 根。 - 将数据存储在 DBFS 根目录中是一种未经建议的旧做法。 有关详细信息,请参阅连接到 DBFS 根外部位置(旧版)。 
- 在“URL”下,输入或选择外部位置的路径。 - 对于 Azure Data Lake Storage 和 R2,有以下选项: - 要从现有 DBFS 装入点复制容器路径,请单击“从 DBFS 复制”。 
- 如果不从现有装入点复制,请使用 URL 字段输入要用作外部位置的容器或存储桶路径。 - 例如, - abfss://my-container-name@my-storage-account.dfs.core.chinacloudapi.cn/<path>或- r2://my-bucket@my-account-id.r2.cloudflarestorage.com/<path>。
 - 对于 DBFS 根目录: - 系统将子路径填充到 DBFS 根存储位置。 如果你是工作区管理员,系统还会为你创建存储凭证。
 
- 选择授予对该外部位置的访问权限的存储凭据。 - 注意 - 如果外部位置用于 DBFS 根,并且你是工作区管理员,则系统会为你创建存储凭证,你无需选择凭证。 - 如果还没有存储凭证,可以按照以下步骤创建一个: - 在“存储凭证”下拉列表中,选择“ + 创建新存储凭证”。 
- 输入的凭据信息取决于存储类型: - 对于 Azure Data Lake Storage,输入访问连接器 ID 和(可选)用户分配的托管标识,该标识授予对存储位置的访问权限。 请参阅 创建访问 Azure Data Lake Storage 的存储凭据 - 对于 Cloudflare API 令牌,输入 Cloudflare 帐户、访问密钥 ID 和机密访问密钥。 请参阅 创建用于连接到 Cloudflare R2 的存储凭据。 
 
- (可选)如果希望用户对该外部位置具有只读访问权限,请单击“高级选项”并选择“只读”。 有关详细信息,请参阅将外部位置标记为只读。 
- (可选)如果外部位置用于 Hive 元存储联合目录,请单击“高级选项”,然后启用“回退模式”。 - 请参阅在外部位置启用回退模式。 
- (可选)若要允许订阅外部位置上的更改通知,请单击“ 高级选项 ”并选择“ 启用文件事件”。 - 有关详细信息,请参阅 (建议)为外部位置启用文件事件。 
- 单击 “创建” 。 
- (可选)将外部位置绑定到特定工作区。 - 默认情况下,任何特权用户都可以使用连接到元存储的任何工作空间上的外部位置。 如果只想允许从特定工作区进行访问,请转到“工作区”选项卡并分配工作区。 请参阅(可选)将外部位置分配给特定工作区。 
- 转到“权限”选项卡,授予使用外部位置的权限。 - 要允许任何人使用该外部位置,必须授予权限: - 要使用外部位置将托管存储位置添加到元存储、目录或架构,请授予 - CREATE MANAGED LOCATION权限。
- 要创建外部表或卷,请授予 - CREATE EXTERNAL TABLE或- CREATE EXTERNAL VOLUME。
 - 单击“授予”。
- 在“<external location>授权”对话框中,选择“主体”字段中的用户、组或服务主体,然后选择要授予的权限。
- 单击“授予”。
 
选项 2:使用 SQL 创建外部位置
若要使用 SQL 创建外部位置,请在笔记本或 SQL 查询编辑器中运行以下命令。 替换占位符值。 有关所需权限和先决条件,请参阅准备工作。
- <location-name>:外部位置的名称。 如果- location_name包含特殊字符,例如连字符 (- -),则它必须用反引号 (- ` `) 引起来。 请参阅名称。
- <bucket-path>:云租户中此外部位置授予访问权限的路径。 例如,- abfss://my-container-name@my-storage-account.dfs.core.chinacloudapi.cn/<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权限的数据工程师只能使用特定工作区访问该数据。
有关如何按工作区限制其他类型的数据访问的详细信息,请参阅将目录访问仅限于特定工作区。
重要
在对外部位置行使特权时,将引用工作区绑定。 例如,如果用户通过从 CREATE TABLE myCat.mySch.myTable LOCATION 'abfss://my-container-name@storage-account-name.dfs.core.chinacloudapi.cn/finance' 工作区发出语句 myWorkspace 创建外部表,则除了常规用户特权检查之外,还会执行以下工作区绑定检查:
- 覆盖 'abfss://my-container-name@storage-account-name.dfs.core.chinacloudapi.cn/finance'的外部位置是否绑定到myWorkspace?
- 目录 myCat是否绑定到具有myWorkspace访问级别的Read & Write?
如果外部位置随后与 myWorkspace 解除绑定,则外部表将继续运行。
此功能还允许从中央工作区填充目录,并使用目录绑定将其提供给其他工作区,而无需在其他工作区中提供外部位置。
将外部位置绑定到一个或多个工作区
要将外部位置分配到特定的工作区,可以使用目录资源管理器或 Databricks CLI。
所需权限:元存储管理员、外部位置所有者或对外部位置拥有  权限。MANAGE
注意
元存储管理员可以使用目录资源管理器查看元存储中的所有外部位置,外部位置所有者可以查看他们在元存储中拥有的所有外部位置,无论外部位置是否已分配到当前工作区。 未分配给工作区的外部位置显示为灰色。
目录资源管理器
- 登录到链接到元存储的工作区。 
- 在边栏中,单击 - 目录。 
- 在“快速访问”页中,单击“外部数据>”按钮,然后转到“外部位置”选项卡。 
- 选择外部位置,然后转到“工作区”选项卡。 
- 在“工作区”选项卡上,清除“所有工作区拥有访问权限”复选框。 - 如果外部位置已绑定到一个或多个工作区,则此复选框已清除。 
- 单击“分配到工作区”,然后输入或查找要分配的工作区。 
若要撤销访问权限,请转到“工作区”选项卡,选择该工作区,然后单击“撤销”。 若要允许从所有工作区进行访问,请选中“所有工作区都具有访问权限”复选框。
CLI
向工作区分配外部位置时需使用两个 Databricks CLI 命令组并分两个步骤完成。
在以下示例中,将 <profile-name> 替换为 Azure Databricks 身份验证配置文件的名称。 它应包括个人访问令牌的值,以及生成个人访问令牌的工作区的工作区实例名称和工作区 ID。 请参阅个人访问令牌身份验证(已弃用)。
- 使用 - external-locations命令组的- update命令将外部位置的- isolation mode设置为- ISOLATED:- databricks external-locations update <my-location> \ --isolation-mode ISOLATED \ --profile <profile-name>- 对于附加到元存储的所有工作区,默认的 - isolation-mode设置为- OPEN。
- 使用 - 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 命令组撤销工作区对外部位置的访问权限的说明。
后续步骤
- 授予其他用户使用外部位置的权限。 请参阅管理外部位置。
- 使用外部位置定义托管存储位置。 请参阅在 Unity Catalog 中指定托管存储位置。
- 使用外部位置定义外部表。 请参阅使用外部表。
- 使用外部位置定义外部卷。 请参阅什么是 Unity Catalog 卷?。