单用户计算上的精细访问控制

本文介绍数据筛选功能,该功能可对单用户计算(配置了单用户访问模式的通用计算或作业计算)上运行的查询实现精细访问控制。 请参阅访问模式

此数据筛选是在幕后使用无服务器计算执行的。

为何单用户计算上的某些查询需要数据筛选?

Unity Catalog 可让你使用以下功能在列和行级别控制对表格数据的访问(也称为精细访问控制):

当用户查询从引用表中排除数据的视图,或查询应用筛选器和掩码的表时,他们可以不受限制地使用以下任何计算资源:

  • SQL 仓库
  • 共享计算

但是,如果使用单用户计算来运行此类查询,则计算和工作区必须满足特定的要求:

如果你的单用户计算资源和工作区满足这些要求,则每当你查询使用精细访问控制的视图或表时,都会自动运行数据筛选。

对具体化视图、流式表和标准视图的支持

除了动态视图、行筛选器和列掩码之外,数据筛选还支持对以下视图和表进行查询,而这些视图和表在运行 Databricks Runtime 15.3 及更低版本的单用户计算上不受支持:

  • 标准视图

    在运行 Databricks Runtime 15.3 及更低版本的单用户计算中,对视图运行查询的用户必须对视图引用的表和视图具有 SELECT ,这意味着无法使用视图来提供精细的访问控制。 在支持数据筛选的 Databricks Runtime 15.4 上,查询视图的用户不需要访问引用的表和视图。

  • 流式处理表

  • 具体化视图

单用户计算上的数据筛选的工作原理是怎样的?

每当查询访问以下数据库对象时,单用户计算资源都会将该查询传递给无服务器计算以执行数据筛选:

  • 基于用户没有 SELECT 权限的表生成的视图
  • 动态视图
  • 定义了行筛选器或列掩码的表
  • 具体化视图和流式表

在下图中,用户对 table_1view_2table_w_rls(应用了行筛选器)具有 SELECT 权限。 用户对 view_2 引用的 table_2 没有 SELECT 权限。

显示数据筛选工作原理的示意图

table_1 的查询完全由单用户计算资源处理,因为不需要筛选。 对 view_2table_w_rls 的查询需要执行数据筛选才能返回用户有权访问的数据。 这些查询由无服务器计算上的数据筛选功能进行处理。

会产生哪些成本?

客户需要为用于执行数据筛选操作的无服务器计算资源付费。 有关定价信息,请参阅平台层和加载项

你可以查询系统计费用量表来了解产生的费用。 例如,以下查询按用户细分计算成本:

SELECT usage_date,
sku_name,
 identity_metadata.run_as,
SUM(usage_quantity) AS `DBUs consumed by FGAC`
FROM system.billing.usage
WHERE usage_date BETWEEN '2024-08-01' AND '2024-09-01'
 AND billing_origin_product = 'FINE_GRAINED_ACCESS_CONTROL'
GROUP BY 1, 2, 3 ORDER BY 1;

查看启用数据筛选时的查询性能

单用户计算的 Spark UI 会显示指标,你可以使用这些指标来了解查询性能。 对于你针对计算资源运行的每个查询,“SQL/数据帧”选项卡会显示查询的图形表示形式。 如果查询涉及数据筛选,则 UI 会在图形底部显示“RemoteSparkConnectScan”操作程序节点。 该节点显示了可用于调查查询性能的指标。 请参阅在 Apache Spark UI 中查看计算信息

显示 RemoteSparkConnectScan 节点的 SparkUI

展开“RemoteSparkConnectScan”操作程序节点,查看可解决以下问题的指标

  • 数据筛选花费了多长时间? 查看“总远程执行时间”。
  • 数据筛选后还剩下多少行? 查看“行输出”。
  • 数据筛选后返回了多少数据(以字节为单位)? 查看“行输出大小”。
  • 有多少数据文件已经过分区修剪,因此不必从存储中读取? 查看“修剪的文件数”和“修剪的文件大小”。
  • 有多少数据文件无法修剪,因此必须从存储中读取? 查看“读取的文件数”和“读取的文件大小”。
  • 在必须读取的文件中,有多少个文件已在缓存中? 查看“缓存命中大小”和“缓存未命中大小”。

限制

  • 不支持对应用了行筛选器或列掩码的表执行写入或刷新表操作。

    具体而言,不支持 INSERT,DELETEUPDATEREFRESH TABLEMERGE 等 DML 操作。 只能从这些表中读取 (SELECT)。

  • 调用数据筛选时,默认会阻止自联接,但你可以通过在运行这些命令的计算机上将 spark.databricks.remoteFiltering.blockSelfJoins 设置为 false 来允许自联接。

    在单用户计算资源上启用自联接之前请注意,数据筛选功能处理的自联接查询可能会返回同一远程表的不同快照。