对 Delta 表应用液体聚类分析

Liquid clustering 是 Microsoft Fabric 中 Delta 表的灵活数据布局策略。 它将静态 Hive 样式分区和手动 Z 顺序维护替换为声明性、更改友好的群集。 你定义按哪些列进行聚簇,Fabric Spark 运行时会自动处理数据的物理布局。

使用这篇文章来:

  • 了解液体聚类分析的工作原理以及何时使用它。
  • 比较液体聚类分析与分区和 Z 顺序。
  • 在表上配置聚类分析。
  • 了解增量液体聚类分析(运行时 2.0+)。
  • 使用会话配置优化群集行为。

什么是液体聚类分析?

Liquid 聚簇对 Delta 表文件中的数据进行组织,使聚簇列中具有相似值的行存放在一起。 该布局支持在查询执行期间实现更高效的文件跳过:当查询按聚簇列进行筛选时,引擎仅读取值范围与谓词条件匹配的文件,跳过其余文件。

与分区不同,液态聚类:

  • 不会为每个列值创建物理目录结构。
  • 无需在创建表时选择聚类列(之后可再更改)。
  • 能够处理高基数列,而不会因成千上万个微小分区而引发潜在的小文件问题。
  • OPTIMIZE 期间进行布局优化,而不是在写入时进行。

相较于分区和 Z-Order 的优势

液态聚类相比 Hive 风格分区和 Z-Order,在灵活性、维护成本以及应对不断演变的数据模式方面具有显著优势。

与 Hive 样式分区相比

方面 Hive 样式分区方法 液体聚类分析
粒度 每个不同的值(或值组合)对应一个目录 文件级值范围,无目录
高基数 创建数千个小文件/目录 处理更自然;将数据分入大小合适的文件中
列更改 需要完整表重写 ALTER TABLE ... CLUSTER BY 适用于下一步 OPTIMIZE
写入路径 写入时必须已知分区列 任何列都可以在之后设置为聚簇列
小文件问题 常见于流式处理或频繁插入中 通过 OPTIMIZE 压缩进行管理

与 Z-Order 相比

方面 Z-Order 液体聚类分析
列更改 必须使用新列重新运行OPTIMIZE ZORDER BY (...) ALTER TABLE ... CLUSTER BY 持久保存该定义
增量支持 无增量模式;请使用 WHERE 手动限制范围 增量模式(运行时 2.0+)仅自动处理新的、已更改或不正常的文件
Metadata 无持久列定义 对表元数据中存储的列进行聚类分析
多列布局 优化时应用的 Z 顺序曲线 单个聚类列使用 Z-Order;2 列及以上使用 Hilbert 曲线,以优化数据局部性

液态聚类在单列布局中使用 Z-Order,在 2 列及以上的布局中使用 Hilbert 曲线——这比 Z-Order 更进一步,因为后者在多维聚类中仅使用 Z-Order 曲线。 Liquid 聚类分析将这两种算法包装在一个增量的元数据感知框架中,以降低持续维护成本。

创建液簇表

在创建表时,使用 CLUSTER BY 子句定义聚类列:

-- Create a new clustered table
CREATE TABLE dbo.sales (
    order_id BIGINT,
    order_date DATE,
    region STRING,
    amount DECIMAL(10,2)
) CLUSTER BY (order_date, region);

-- Create from query results
CREATE TABLE dbo.sales_clustered
CLUSTER BY (order_date, region)
AS SELECT * FROM raw_sales;

-- Enable on existing table
ALTER TABLE dbo.sales_txn CLUSTER BY (order_date, region);

更改聚类列

与分区不同,可以随时更改聚类分析列,而无需重写数据:

-- Change clustering columns
ALTER TABLE sales CLUSTER BY (region, product_category);

-- Remove clustering (table becomes unclustered)
ALTER TABLE sales CLUSTER BY NONE;

更改聚类列后,新布局会在下一次 OPTIMIZE 运行时生效。 现有文件将保留其原有布局,直到它们被重新聚类。

使用 OPTIMIZE 应用聚类分析

在执行 OPTIMIZE 命令期间应用群集。 无需在语句中 OPTIMIZE 指定列,因为聚类分析定义存储在表元数据中:

-- Cluster the table using the defined clustering columns
OPTIMIZE sales;

-- Recluster partial Z-Cubes and Z-Cubes with different clustering keys or clustering providers
OPTIMIZE sales FULL;

当你更改聚簇键并希望重建不符合当前聚簇策略的 Z-Cubes 时,使用 OPTIMIZE FULLZ-Cube 是液态聚类用于将具有相同聚类列的文件分组的逻辑单元。 数据聚集到单个 Z 多维数据集中,直到群集密钥更改或数据量超过 100 GB。

小窍门

从 Fabric Runtime 2.0 开始,Native 执行引擎支持对液体聚集表执行 OPTIMIZE,从而提供 30-50% 更快的多维聚类分析性能。 较早版本的运行时会回退到常规的非加速 Spark 执行模式。

液体聚类分析的工作原理

在液体聚集表上运行 OPTIMIZE 时,会发生以下情况:

  1. 文件选择:引擎选择需要聚类分析的文件。
    • Runtime 2.0+(增量聚类策略)中,仅选择未聚类的、不健康的、小型的或删除向量文件。
    • Runtime 1.3 中,会选取每个小于 100 GB 的 Z-Cube 中的所有文件,无论这些文件是否已经得到了良好聚类。
  2. 装箱算法:将所选文件分组装入多个箱中,以实现最佳输出文件大小。
  3. 重新分区:每个分箱中的数据都会使用空间填充曲线重新分区(多列使用 Hilbert 曲线,单列使用 Z-Order 曲线)。
  4. 文件写入:重新分区后的数据会作为新文件写入,这些文件在聚类列上的值范围较窄。
  5. 元数据更新:Delta 日志记录文件替换,使用群集元数据标记新文件。

最终得到的一组文件在聚簇列上具有互不重叠(或仅有极少重叠)的取值范围,从而使引擎能够跳过与查询谓词不匹配的文件。

Caution

Fabric 运行时 1.3(Delta 3.2):请谨慎使用液态聚类。 在此运行时,液体聚类分析使用完整的 Z 多维数据集重写策略 - 每次运行时都会重写 Z 多维数据集中的每个文件。 仅当 Z-Cube 的大小超过 100 GB 时,才会将其保留(跳过)。 对于小于 100 GB 的表,完全重写意味着每次 OPTIMIZE 运行都会重写所有表数据,即使数据已完全聚集也是如此。 这会导致严重的写入放大。

  • 请勿在运行时 1.3 中使用自动压缩和液体聚类分析。 每个自动压缩触发器都可能导致完整表重写,而不只是聚集新的/已更改的数据。
  • 避免在每次写入操作后运行 OPTIMIZE 在 Runtime 1.3 中,将聚类限制在有策略且有明确目的的运行中进行,并接受两次运行之间较低的聚类时效性。

增量液体聚类分析(消除了这种写入放大)仅在 Fabric Runtime 2.0 中可用。

增量液体聚类分析

Fabric Runtime 2.0(Delta 4.1)开始,液态聚类默认使用 增量聚类策略。 增量策略是对标准聚类分析行为的显著改进。

Important

增量液体聚类分析仅在 Fabric Runtime 2.0 及更高版本中可用。 在早期运行时中,使用标准(完全重写)行为, OPTIMIZE 在每次运行时都会重写 Z 多维数据集中的所有文件。

为什么增量聚类分析策略很重要

标准聚类分析算法在每次运行时都重写 Z 多维数据集OPTIMIZE文件(最多 100 GB),而不管它们是否已完全聚类化。 对于仅追加少量数据的表,聚簇成本会随着表大小线性增长,而不是随着新增数据量增长。

增量模式通过仅选择实际需要聚类分析的文件来解决完全重写问题:

  • 未聚类文件:没有聚类元数据的新写入的数据
  • 小文件:低于目标文件大小阈值的文件
  • 具有删除矢量的文件:累积删除超过清理阈值的文件

已良好聚类且大小合适的文件将被完全跳过。

自动重新聚类

增量液体聚类分析包括自动重叠检测,称为 自动重新聚类分析,以随时间推移保持聚类分析质量。 当新数据到达时,它可以在文件值范围之间创建重叠,从而降低数据跳过有效性。 自动重新聚类可检测跨文件的重叠值范围,并且仅选择性地对受影响的文件重新聚类。

每当有新的或已更改的数据需要进行聚类时,自动重新聚类都会作为 OPTIMIZE 的一部分自动运行。 无需手动干预,也无需计划的全量重新聚簇。 随着数据的发展,增量聚类分析策略保持近乎最佳的聚类分析质量。

恢复为完整重写行为

如果需要禁用增量群集策略并使用完全重写行为,请设置以下配置:

SET spark.microsoft.delta.optimize.clustering.strategy.incremental = FALSE;

OPTIMIZE sales;

或者,使用 OPTIMIZE FULL 可在无需更改会话设置的情况下执行一次性完整重新聚类:

OPTIMIZE sales FULL;

注释

增量聚类策略刻意容许与理论最优布局存在轻微偏差,从而显著降低写入放大。 运行 OPTIMIZE FULL 通过将 Z-Cubes 完全重建至理论最优状态来弥合这一差距,但写入成本更高。

配置参考

以下会话配置控制 Fabric Runtime 2.0+ 中的液体聚类分析行为。

增量聚类分析

Configuration 类型 Default 说明
spark.microsoft.delta.optimize.clustering.strategy.incremental 布尔 true 用于增量群集的主交换机。 当 true 时,OPTIMIZE 仅处理未聚集、不健康、小文件和带删除向量的文件。 当 false 时,所有大小低于 100 GB 的 Z-Cubes 文件都将被重写(标准行为)。
spark.microsoft.delta.optimize.clustering.strategy.incremental.autoRecluster 布尔 true 启用后可自动检测并重新聚类数据范围重叠的文件。 仅当启用增量群集时适用。

自动重聚类调优

这些配置控制自动重新聚类的敏感性和范围。 默认值适用于大多数工作负荷。 仅当您需要调整聚类质量和写入放大之间的权衡时,才调整它们。

Configuration 类型 Default 说明
spark.microsoft.delta.optimize.clustering.strategy.incremental.autoRecluster.minOffendingFiles int 4 触发重新聚集所需的最少重叠文件数。 较小的值会更早重新聚类(查询性能更好,但写入成本更高)。 必须≥ 2。
spark.microsoft.delta.optimize.clustering.strategy.incremental.autoRecluster.minOverlapThreshold Double 0.75 聚类维度重叠分数阈值。 得分高于此值的文件对将被视为存在重叠。 必须处于范围 (0.25, 1.0]。 较低的值更具攻击性。

选择聚类列

为获得最佳结果,请根据最常见的查询筛选器模式选择聚类分析列:

  • 选择 1 到 4 列,这些列经常出现在 WHERE 子句中。 更多的列会削弱空间填充曲线按列跳过文件的效果,并增加数据聚类所需的时间。
  • 考虑列基数。 低基数列会产生更少的不同值范围,这会在与高基数聚类键结合使用时降低文件跳过带来的收益。
  • 列顺序对聚类分析没有影响。 之后 CLUSTER BY 指定的列顺序不会影响生成的多维聚类分析。

支持的列类型

并非所有列类型都可用作聚类键。 引擎评估每个列的数据类型以确定资格。

始终符合条件(原子类型):

  • NumericTypeByteType、、ShortTypeIntegerTypeLongTypeFloatTypeDoubleTypeDecimalType
  • DateType
  • TimestampType
  • TimestampNTZType
  • StringType

有条件符合资格:

注释

可以从 Fabric Spark 运行时 2.0(Delta 4.1)开始启用以下类型

  • StructType:当启用 spark.microsoft.delta.clusteredTable.complexTypes.enabled 时,且所有叶字段本身都是符合条件的类型。
  • ArrayType:当 spark.microsoft.delta.clusteredTable.complexTypes.enabled 已启用,且元素类型符合条件时。
  • MapType:启用时 spark.microsoft.delta.clusteredTable.complexTypes.enabled ,键和值类型都是可排序的且符合条件。

不符合条件:

  • BinaryType
  • BooleanType
  • NullType

有关文件级统计信息中使用的对应符合条件的数据类型,请参阅 “文件跳过:符合条件的数据类型”

与其他功能的交互

Feature Behavior
分区 不兼容。 为了实现文件跳过,与分区相比,更推荐使用液态聚类。
Z-Order 不兼容。 就文件跳过而言,相比 Z-Order,更推荐使用 Liquid Clustering。
快速优化 自 Runtime 2.0 起兼容。 在早期运行时,快速优化对液体聚集表没有影响。 在 OPTIMIZE 期间,如果没有足够的小文件,或者数据不足以生成大小合适的输出文件,则跳过聚类。
自适应目标文件大小 兼容。 自适应评估设置的目标文件大小用作聚类分析的目标大小。
优化写入 兼容。 在写入时生成合并后的文件,然后在 OPTIMIZE 期间进行聚簇。
自动压缩 请勿在 Runtime 1.3 或更早版本中用于液体聚类分析。 在这些运行环境中,每次自动压缩触发时,都会重写大小小于 100 GB 的 Z-Cubes 中的所有数据,从而导致严重的写入放大。 在运行时 2.0+ 中,自动压缩是兼容的:增量群集确保只重写新的或不正常的文件。 自动压缩整理负责小文件合并;OPTIMIZE 负责聚簇布局。
删除向量 已删除行数超过阈值的文件将被选中进行聚类,而不考虑其聚类状态。
V-Order 兼容。 V-Order 和液态聚类作用于不同的维度(文件内部的布局 vs. 跨文件的值范围)。 两者都可以一起应用。

最佳做法

  • 在批量写入之后或按计划对流式表定期运行OPTIMIZE,但前提是只能在Runtime 2.0 及更高版本中这样做,因为增量聚类策略使频繁运行的成本很低。 在 Runtime 1.3 及更早版本中,每次 OPTIMIZE 运行都会重写低于 100 GB 的 Z-Cubes 中的所有数据,因此应谨慎执行,且不应频繁运行。
  • 请谨慎使用OPTIMIZE FULL。 仅在更改聚类列后或需要进行一次性质量重置时再使用它。
  • 通过在 Spark UI 或查询计划中查看查询扫描指标(已扫描文件数与文件总数),监控聚簇质量
  • 结合优化写入用于流式工作负载,以确保每个微批次生成数量可控的文件供聚簇使用。