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

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

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

为什么对单个用户计算进行某些查询需要数据筛选?

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 来允许自联接。

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