创建外部位置以将云存储连接到 Azure Databricks
本文介绍如何在 Unity Catalog 中配置外部位置,以将云存储连接到 Azure Databricks。
外部位置将 Unity Catalog 存储凭据与云对象存储容器相关联。 外部位置用于定义目录和架构的托管存储位置,并定义外部表和外部卷的位置。
可以创建一个引用 Azure Data Lake Storage Gen2 存储容器或 Cloudflare R2 存储桶中的存储的外部位置。
可以使用目录资源管理器、Databricks CLI、笔记本或 Databricks SQL 查询中的 SQL 命令或者 Terraform 来创建外部位置。
注意
定义卷时,对卷路径下数据的云 URI 访问受卷权限约束。
开始之前的准备工作
先决条件:
在 Azure Databricks 中创建外部位置对象之前,必须创建要用作外部位置的 Azure Data Lake Storage Gen2 存储容器或 Cloudflare R2 存储桶。
用作外部位置的 Azure Data Lake Storage Gen2 存储帐户必须具有分层命名空间。
必须在 Azure Databricks 中定义存储凭据,以访问云存储位置路径。 请参阅创建用于连接到 Azure Data Lake Storage Gen2 的存储凭据,以及创建用于连接到 Cloudflare R2 的存储凭据。
权限要求:
- 你必须对元存储和外部位置中引用的存储凭据拥有
CREATE EXTERNAL LOCATION
权限。 默认情况下,元存储管理员对元存储具有CREATE EXTERNAL LOCATION
。
使用目录资源管理器手动创建外部位置
可以使用目录资源管理器手动创建外部位置。
权限和先决条件:请参阅准备工作。
要创建外部位置,请执行以下操作:
登录到一个附加到元存储的工作区。
在边栏中,单击
“目录”。
在“目录”窗格顶部,单击
“添加”图标,然后从菜单中选择“添加外部位置”。
也可在“快速访问”页中单击“外部数据 >”按钮,转到“外部位置”选项卡,然后单击“创建连接”。
输入外部位置名称。
可以选择从现有装入点复制容器路径(仅限 Azure Data Lake Storage Gen2 容器)。
如果不是从现有装入点复制,请使用“URL”字段输入要用作外部位置的存储容器或 R2 存储桶路径。
例如,
abfss://my-container-name@my-storage-account.dfs.core.windows.net/<path>
或r2://my-bucket@my-account-id.r2.cloudflarestorage.com/<path>
。选择授予对该外部位置的访问权限的存储凭据。
(可选)如果希望用户对该外部位置具有只读访问权限,请单击“高级选项”并选择“只读”。 有关详细信息,请参阅将外部位置标记为只读。
单击 “创建” 。
(可选)将外部位置绑定到特定工作区。
默认情况下,任何特权用户都可以使用连接到元存储的任何工作空间上的外部位置。 如果只想允许从特定工作区进行访问,请转到“工作区”选项卡并分配工作区。 请参阅(可选)将外部位置分配给特定工作区。
授予使用外部位置的权限。
要允许任何人使用该外部位置,必须授予权限:
- 要使用外部位置将托管存储位置添加到元存储、目录或架构,请授予
CREATE MANAGED LOCATION
权限。 - 要创建外部表或卷,请授予
CREATE EXTERNAL TABLE
或CREATE EXTERNAL VOLUME
。
要使用目录资源管理器授予权限,请执行以下操作:
- 单击外部位置名称以打开详细信息窗格。
- 在“权限”选项卡上,单击“授权”。
- 在“
<external location>
授权”对话框中,选择“主体”字段中的用户、组或服务主体,然后选择要授予的权限。 - 单击“授予”。
- 要使用外部位置将托管存储位置添加到元存储、目录或架构,请授予
使用 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。
所需权限:元存储管理员或外部位置所有者。
注意
元存储管理员可以使用目录资源管理器查看元存储中的所有外部位置,外部位置所有者可以查看他们在元存储中拥有的所有外部位置,无论外部位置是否已分配到当前工作区。 未分配给工作区的外部位置显示为灰色。
目录资源管理器
登录到链接到元存储的工作区。
在边栏中,单击
“目录”。
在“目录”窗格顶部,单击
齿轮图标,然后选择“外部位置”。
也可在“快速访问”页中单击“外部数据 >”按钮,然后转到“外部位置”选项卡。
选择外部位置,然后转到“工作区”选项卡。
在“工作区”选项卡上,清除“所有工作区拥有访问权限”复选框。
如果外部位置已绑定到一个或多个工作区,则此复选框已清除。
单击“分配到工作区”,然后输入或查找要分配的工作区。
若要撤销访问权限,请转到“工作区”选项卡,选择该工作区,然后单击“撤销”。 若要允许从所有工作区进行访问,请选中“所有工作区都具有访问权限”复选框。
CLI
向工作区分配外部位置时需使用两个 Databricks CLI 命令组并分两个步骤完成。
在以下示例中,将 <profile-name>
替换为 Azure Databricks 身份验证配置文件的名称。 它应包括个人访问令牌的值,以及生成个人访问令牌的工作区的工作区实例名称和工作区 ID。 请参阅 Azure Databricks 个人访问令牌身份验证。
使用
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 卷?。