← 全部文章

Liquid Clustering 号称四类负载赢三类,其实只测了三类

正面拍的一整面洞洞板墙,插满了几百个缝纫线筒,同色的线筒大致聚成一块块:左边橙红,中间蓝白,右边米黄和棕色
封面 · 来源: Luba Glazunova / Unsplash
目录
  1. 同一份 5,000 万行,三种摆法
  2. 三类查询,各有赢家
  3. 第四类“全表聚合”的数字,和第二类一模一样
  4. 三种布局,一张表比清楚

表该按日期分区、做 ZOrder,还是改成 Liquid Clustering?InfoQ 10 月 24 日刊出 Kushal Kumar Vishwakarma 的一篇基准,把三种布局放在同一份数据上比了四类查询。1用 Databricks 的团队很值得读,但数字要逐行看。

同一份 5,000 万行,三种摆法

数据是约 5,000 万条合成零售交易。分区表按交易日期 txn_date 分目录;ZOrder 和 Liquid Clustering 用同样三个键:customer_id、region、txn_date。每条查询跑 5 次,关掉缓存,取耗时和读取量的中位数。2ZOrder 每多一个键,效果就弱一些;4Liquid Clustering 的 OPTIMIZE 是增量的,键也能随时改。3

FIG.1三种布局在三类查询上的耗时(横条,同一比例)和读取量,每条查询 5 次运行的中位数。

三类查询,各有赢家

  • 查一个客户(W1):Liquid Clustering 1.003 秒,比分区快 49%。ZOrder 读得最少,却慢了 0.4 秒,读取量少不等于快。2
  • 查一个月(W2):日期在 ZOrder 键里排第三,结果比按日期分区慢 78%。1如果你的 ZOrder 键里日期不在第一位,时间范围查询值得先测一遍。Liquid Clustering 读的数据和分区一样多,却快了约 37%。2
  • 三列一起过滤(W3):Liquid Clustering 唯一输掉的一类,慢近五倍、多读约十倍。1分区和 ZOrder 只差 7 毫秒,这一类的教训是“别用 Liquid Clustering”。2

第四类“全表聚合”的数字,和第二类一模一样

原文的第四类负载是不带过滤、按地区汇总的全表聚合,结论也是 Liquid Clustering 最快(659 毫秒),ZOrder 最慢(1.845 秒),分区居中(1.038 秒)。1但这三组耗时和读取量与只查一个月的 W2 逐项相同,7 月 15 日 Medium 初版就已如此。5文章和代码里都找不到 W4 单独运行的记录,这一项暂时不能当作比较依据。2

三种布局,一张表比清楚

FIG.2三种布局的取舍。强项和弱项来自这篇基准的三类查询,维护与提醒来自 Databricks 文档。

Databricks 也建议新表都用 Liquid Clustering。3但真正的答案在自己的查询历史里,可以分四步:

  1. 从查询历史里按过滤列给查询分组,挑出次数最多的三类;
  2. 抽一份带着真实热点和偏斜的样本数据,按三种布局各建一张表;
  3. 每条查询关掉缓存跑五次,取中位数,在查询画像里同时记下耗时和读取量;作者的代码在 GitHub 上,可以直接改;2
  4. 补上文章没测的两项:全表聚合,以及每天写入后维护布局要花多少计算。

参考

  1. 何时应使用 Liquid Clustering?湖仓布局策略基准测试, InfoQ 中文
  2. When Should You Use Liquid Clustering? A Practitioner's Benchmark of Lakehouse Layout Strategies (write-up and code), GitHub · kushalvishwak
  3. Use liquid clustering for tables, Databricks Documentation
  4. Data skipping, Databricks Documentation
  5. A Practitioner's Benchmark of Lakehouse Layout Strategies, Towards Data Engineering · Medium

评论