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 FULL。
Z-Cube 是液态聚类用于将具有相同聚类列的文件分组的逻辑单元。 数据聚集到单个 Z 多维数据集中,直到群集密钥更改或数据量超过 100 GB。
小窍门
从 Fabric Runtime 2.0 开始,Native 执行引擎支持对液体聚集表执行 OPTIMIZE,从而提供 30-50% 更快的多维聚类分析性能。 较早版本的运行时会回退到常规的非加速 Spark 执行模式。
液体聚类分析的工作原理
在液体聚集表上运行 OPTIMIZE 时,会发生以下情况:
-
文件选择:引擎选择需要聚类分析的文件。
- 在 Runtime 2.0+(增量聚类策略)中,仅选择未聚类的、不健康的、小型的或删除向量文件。
- 在 Runtime 1.3 中,会选取每个小于 100 GB 的 Z-Cube 中的所有文件,无论这些文件是否已经得到了良好聚类。
- 装箱算法:将所选文件分组装入多个箱中,以实现最佳输出文件大小。
- 重新分区:每个分箱中的数据都会使用空间填充曲线重新分区(多列使用 Hilbert 曲线,单列使用 Z-Order 曲线)。
- 文件写入:重新分区后的数据会作为新文件写入,这些文件在聚类列上的值范围较窄。
- 元数据更新: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指定的列顺序不会影响生成的多维聚类分析。
支持的列类型
并非所有列类型都可用作聚类键。 引擎评估每个列的数据类型以确定资格。
始终符合条件(原子类型):
-
NumericType(ByteType、、ShortTypeIntegerType、LongType、FloatType、DoubleType、DecimalType) DateTypeTimestampTypeTimestampNTZTypeStringType
有条件符合资格:
注释
可以从 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,键和值类型都是可排序的且符合条件。
不符合条件:
BinaryTypeBooleanTypeNullType
有关文件级统计信息中使用的对应符合条件的数据类型,请参阅 “文件跳过:符合条件的数据类型”。
与其他功能的交互
| 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 或查询计划中查看查询扫描指标(已扫描文件数与文件总数),监控聚簇质量。
- 结合优化写入用于流式工作负载,以确保每个微批次生成数量可控的文件供聚簇使用。