azure databricks中使用Unity Catalog 03--Data Sharing

发布时间 2023-03-28 22:21:52作者: John.Xiong

本文介绍 Azure Databricks 中的 Delta Sharing,这是安全的数据共享平台,可用于与组织外的用户共享 Azure Databricks 中的数据。

sharing分两类:

  • 开放共享:可与任何用户共享数据(无论他们是否有权访问 Azure Databricks)。

  • Databricks-to-Databricks 共享:可与无权访问你的 Unity Catalog元存储的但能登录datarbicks的用户共享数据,可以跨区域、云平台的。

什么是 Delta Sharing

Delta Sharing 是由 Databricks 开发的开放协议,用于与其他组织进行安全的数据共享,而不考虑他们使用的计算平台。 Azure Databricks 将 Delta Sharing 构建到其 Unity Catalog 数据管理平台中,使 Azure Databricks 用户(称为数据提供者)能够与其组织外的个人或组(称为 数据接收者)共享数据。

通过 Delta Sharing 与 Unity Catalog 的本机集成,可在一个平台上管理、治理、审核和跟踪共享数据的使用情况。 事实上,你的数据必须在 Unity Catalog 中注册,才能用于安全共享。 数据还必须采用 Delta 表格式。

delta-sharing[6]

共享和接收者

Azure Databricks 中 Delta Sharing 的主要概念是“共享”和“接收者”。

shares-and-recipients[4]

什么是共享

在 Delta Sharing 中,共享是要与一个或多个接收者共享的表和表分区的只读集合。

共享是在 Unity Catalog 中注册的安全对象。 一个共享可以包含单个 Unity Catalog 元存储中的表。 可随时在共享中添加或删除表,并且可随时分配或撤销数据接收者对共享的访问权限。

如果从 Unity Catalog 元存储删除某个共享,则该共享的所有接收者都将无法访问该共享。

什么是接收者

接收者是将组织与允许组织访问一个或多个共享的凭据或安全共享标识符相关联的对象。

作为数据提供者(共享者),可为任何给定的 Unity Catalog 元存储定义多个接收者,但如果要与特定用户或用户组共享来自多个元存储的数据,则必须为每个元存储单独定义接收者。 一个接收者可以访问多个共享。

如果从 Unity Catalog 元存储删除接收者,则该接收者将失去对其以前可以访问的所有共享的访问权限。

开放共享与 Databricks-to-Databricks 共享

Delta Sharing 的使用方式取决于与谁共享数据:

  • 通过开放共享,可与任何用户共享数据(无论他们是否有权访问 Azure Databricks)。

  • 通过 Databricks-to-Databricks 共享,可与无权访问你的 Unity Catalog 元存储的但能登录datarbicks的用户共享数据。

什么是开放 Delta Sharing

如果要与 Azure Databricks 工作区外的用户共享数据(无论他们是否使用 Databricks),可使用开放 Delta Sharing 安全地共享数据。 作为数据提供者,可生成令牌并将其与接收者安全地共享。 他们使用该令牌进行身份验证,并获取对你已向其授予访问权限的共享中包含的表的读取访问权限。

接收者可使用许多计算工具和平台访问共享数据,包括:

Azure Databricks Apache Spark Pandas Power BI

Databricks-to-Databricks Delta Sharing 是什么

如果要与无权访问你的 Unity Catalog 元存储的用户共享数据,可使用 Databricks-to-Databricks Delta Sharing,只要接收者有权访问为 Unity Catalog 启用的 Databricks 工作区。 通过 Databricks-to-Databricks 共享,可与其他 Databricks 帐户中的用户共享数据(无论这些用户是使用 AWS 还是 Azure),这是在自己的 Databricks 帐户中跨不同 Unity Catalog 元存储安全地共享数据的绝佳方法。

此方案的优点是共享接收者不需要令牌来访问共享,提供者也不需要管理接收者令牌。 共享连接的安全性(包括所有验证、身份验证和审核)完全通过 Delta Sharing 和 Databricks 平台进行管理。

管理员配置一个Delta Sharing

步骤1:启用delta Sharing

以 Azure Databricks 帐户管理员身份登录到帐户控制台,单击“启用 Delta Sharing 以允许 Databricks 用户在组织外部共享数据”旁边的复选框

配置接受者令牌生存期,此配置设置所有接受者令牌过期后必须重新生成的时间周期。 接受者令牌只能在开放共享协议中使用。 Databricks 建议配置默认令牌生存期,而不是允许令牌无限期有效

更改元存储的默认接受者令牌生存期时,现有接受者的接受者令牌生存期不会自动更新。 若要为给定的接受者应用新的令牌生存期,必须轮换其令牌。 请参阅管理接受者令牌(开放共享)

勾选“设置过期”,设定token过期的时间

(可选)输入组织的名称,收件者可以使用该名称来标识与他们共享的人

image-20230328144605800[4]

步骤2:创建共享

要求

创建共享:

  • 你需是元存储管理员,或者对要共享的数据所要注册到的 Unity Catalog 元存储拥有 CREATE_SHARE 特权。

  • 必须使用附加了 Unity Catalog 元存储的 Azure Databricks 工作区创建共享。

若要将表添加到共享,你必须是以下角色之一:

  • 元存储管理员。

  • 共享所有者,还必须对表拥有 SELECT 权限。 必须保留该特权才能继续共享表。 如果丢失该表,则接受者无法通过共享访问该表。 因此,Databricks 建议使用组作为共享所有者。

计算要求:

  • 如果你使用 Databricks 笔记本创建共享,则群集必须使用 Databricks Runtime 11.2 或更高版本以及支持 Unity Catalog 的群集访问模式。

  • 如果你使用 Databricks SQL,则 SQL 仓库必须使用计算版本 2022.35 或更高版本。

2.1 创建共享对象

所需的权限:具有元存储的 CREATE_SHARE 特权的元存储管理员或用户

image-20230328145348217[4]

2.2 将表添加到共享

所需的权限:元存储管理员或共享对象的所有者。 所有者还必须对表具有 SELECT 特权,并且只要希望共享表,就必须保持该特权。

image-20230328145809418[4]

image-20230328150012430[4]

  • 别名:使表名更具可读性。 别名是接受者明白且必须在查询中使用的表名称。 如果指定了别名,则接受者不能使用实际表名。

  • 分区:如果只希望共享表的一部分,则需指定分区(例如 (column = 'value'))。

  • 历史记录共享:允许增量表跟踪表版本之间的行级别更改。如果表启用了历史记录共享,则接受者可以从当前表版本开始按版本查询表数据,没有启用查询历史版本会报错。

    image-20230328162151336[4]

步骤3:创建和管理Delta Sharing的数据接收者

接收者是一个命名对象,表示现实世界中使用共享数据的用户或用户组的标识。 创建接收者的方式根据接收者是否有权访问启用了 Unity Catalog 的 Databricks 工作区而异:

  • 对于有权访问启用了 Unity Catalog 的 Databricks 工作区的接收者,你可以使用完全由 Databricks 管理的安全连接创建一个接收者对象。 这种共享模式称为“Databricks 到 Databricks 共享”。

  • 对于无权访问启用了 Unity Catalog 的 Databricks 工作区的接收者,必须使用开放共享,以及由你使用基于令牌的身份验证管理的安全连接。

创建接收者要求

  • 你需是元存储管理员,或者对要共享的数据所要注册到的 Unity Catalog 元存储拥有 CREATE_RECIPIENT 特权。

  • 必须使用附加了 Unity Catalog 元存储的 Azure Databricks 工作区创建接收者。

  • 如果你使用笔记本或 Databricks SQL 查询创建接收者,则使用的群集或 SQL 仓库必须满足以下要求:

    • 如果你使用 Databricks 笔记本创建接收者,则群集必须使用 Databricks Runtime 11.2 或更高版本以及支持 Unity Catalog 的群集访问模式。

    • 如果你使用 Databricks SQL,则 SQL 仓库必须使用计算版本 2022.35 或更高版本。

对于其他接收者管理操作(例如查看、删除和更新),请参阅特定于操作的部分中列出的权限要求。

为有权访问Databricks的用户创建接收者对象(Databricks to Databricks 共享)

如果数据接收者有权访问启用了 Unity Catalog 的 Databricks 工作区,则你可以创建身份验证类型为 DATABRICKS 的接收者对象。

身份验证类型为 DATABRICKS 的接收者对象表示特定 Unity Catalog 元存储中的数据接收者,该接收者在接收者对象定义中由包含元存储的云、区域和 UUID 的共享标识符字符串标识。 只能在该元存储中访问与该接收者共享的数据。

  1. 请求接收者的共享标识符

    共享标识符是由元存储的云、区域和 UUID(元存储的唯一标识符)组成的字符串,格式为 <cloud>:<region>:<uuid>。

     %sql
    SELECT CURRENT_METASTORE();

    image-20230328151405298[4]

  2. 创建接收者

    image-20230328151508103[4]

    image-20230328155502366[4]

步骤4:向接收者授予对共享的访问权限

点击“添加接收者”选择新建的接收者

image-20230328155546016[4]

image-20230328155557582[4]

步骤5:读取使用Databricks to Databricks共享的数据

访问共享表中的数据

若要读取共享表中的数据:

  • 特权用户必须从包含该表的共享创建一个目录。 这可以是元存储管理员,也可以是对 Unity Catalog 元存储拥有 CREATE_CATALOG 特权并对提供程序对象具有所有权的用户。

  • 该用户或拥有相同特权的用户必须向你授予对该共享表的访问权限。

  • 可以像访问 Unity Catalog 元存储中注册的任何其他表一样访问该表。

  1. 对一个普通用户在metadata中授予CREATE CATALOG和USE PROVIDER的权限。

    image-20230328160215307[4]

  2. 普通用户登录启用了unity catalog的workspace。找到“shared with me”的provider。

    image-20230328160408694[4]

    点击unitycatalog-demo进入可以看到别人分享的share,点击create catalog,输入一个catalog的名字

    image-20230328160534610[4]

    image-20230328160730544[4]

步骤6:查询历史版本和CDF

CDF可能是bug

image-20230328162311488[4]

创建开放共享

开放共享的设置和安全注意事项

使用开放共享模型时,良好的令牌管理是安全共享数据的关键:

数据提供程序可以通过指定 IP 访问列表来限制接受者访问特定的网络位置,从而提供额外的安全性。 请参阅使用 IP 访问列表限制 Delta Sharing 接受者访问权限(开放共享)

步骤1:创建接受者

创建接受者,不要输入Sharing identifier,copy下activation link。

image-20230328162853980[4]

步骤2:打开激活链接,下载凭据文件

image-20230328163154404[4]

image-20230328164457628[4]

下载完成后,OPEN share的token将激活,也可以在IP access list中设置IP白名单。

image-20230328163254958[4]

后续就是分配共享,接收者通过下载的凭据,然后使用凭据文件访问共享数据,共享数据是只读的。 用户可以使用其选择的平台或工具访问数据。

步骤3:example delta_sharing/powerbi读取共享数据

python delta_sharing读取数据

先安装:pip install delta-sharing

编写py,加载.share的凭证文件

 #!/usr/bin/env python3
# -*- coding:utf-8 -*-
import delta_sharing
profile_file = f"D:\my_vscode_workspace\delta_sharing_demo\config.share"
client = delta_sharing.SharingClient(profile_file)
print(client._profile.endpoint)
print(client._profile.bearer_token)

# client.list_all_tables()
# client.list_shares()
table_url = profile_file + "#sharedemo01.mytestdb.第一个外部表"
data = delta_sharing.load_as_pandas(table_url, limit=10)
print(data)

image-20230328220228906[4]

使用powerBI访问数据

image-20230328204801085[4]

image-20230328214142201[4]

pbi要更新到较新的版本,否则可能报错:Unable to load DLL 'ParquetSharpNative'

目前发现的小bug:

share配置表的时候没有CDF这个选项,但是save后却有CDF这个列,但是都是选不了的,相当于没法启用CDF,执行CDF查询也会报错。

image-20230328161844601[4]

image-20230328161931893[4]