H2O.ai 数据库类操作基准测试回归

Author Avatar
Tom Ebergen
2023-04-14 · 8 分钟

TL;DR: 我们已经复活了 H2O.ai 数据库类操作基准测试,并使用了最新的库,计划持续重新运行它。

直接跳到结果

我们在 2023 年 11 月发布了一篇关于 H2O.ai 基准测试的新博文,并改进了基准测试设置以提高可复现性。详情请参阅新文章:“H2O.ai 数据库基准测试更新!”

H2O.ai 数据库类操作基准测试 是数据分析和 R 社区中一个著名的基准测试。该基准测试衡量了 data.table、Polars、dplyr、ClickHouse、DuckDB 等各种分析工具的 groupby 和 join 性能。自 2021 年 7 月 2 日以来,该基准测试一直处于休眠状态,没有结果更新或维护。此后,基准测试中衡量的许多分析系统都经历了显著改进,这让许多维护者好奇他们的分析工具在该基准测试中的排名如何。

DuckDB 决定重新启用 H2O.ai 基准测试,并在可预见的未来对其进行维护。DuckDB 项目决定维护该基准测试的一个原因是,自 2021 年 7 月 2 日发布最新结果以来,DuckDB 已发布了 10 个新的次要版本。在 r3-8xlarge AWS 机器上运行了部分基准测试后,DuckDB 在该基准测试中名列前茅。此外,DuckDB 项目希望通过持续将 DuckDB 与其他分析系统进行比较,来展示其对性能的承诺。虽然 DuckDB 提供了差异化的易用性,但原始性能和可扩展性对于快速解决棘手问题至关重要。此外,就像许多数据同行一样,我们对速度有着强烈的需求。因此,我们决定分叉该基准测试,更新底层依赖项,并在包含系统的最新版本上运行该基准测试。您可以在 GitHub 上找到该仓库。

新基准测试的结果非常有趣,但首先快速总结一下基准测试以及进行了哪些更新。

H2O.ai 数据库类操作基准测试

有 5 个基本分组测试和 5 个高级分组测试。这 10 个分组查询都集中在以下组合上

  • 低基数(少数大组)
  • 高基数(许多非常小的组)
  • 按整数类型分组
  • 按字符串类型分组

每个查询只运行两次,并报告两次结果。这样我们可以看到冷运行的性能以及数据缓存可能产生的影响。这样做的目的是避免在热系统上报告任何潜在的“最佳”结果。数据分析师只需运行一次查询即可获得答案。没有人会为了更快地获得另一升牛奶而第二次开车去商店。

报告的时间是运行所有 5 个查询两次所需时间的总和。

有关具体查询的更多信息可在下方找到。

数据和查询

自基准测试休眠以来,查询没有改变。数据生成方式相当简单。检查 datagen 文件,您会发现列是使用小、中、大组的字符和整数值生成的。类似的生成逻辑也适用于连接数据生成。

查询 SQL 目标
分组 #1 SELECT id1, sum(v1) AS v1 FROM tbl GROUP BY id1 对大基数组求和,按 varchar 分组
分组 #2 SELECT id1, id2, sum(v1) AS v1 FROM tbl GROUP BY id1, id2 对中等基数组求和,按 varchar 分组
分组 #3 SELECT id3, sum(v1) AS v1, mean(v3) AS v3 FROM tbl GROUP BY id3 对许多小基数组求和并求平均值,按 varchar 分组
分组 #4 SELECT id4, mean(v1) AS v1, mean(v2) AS v2, mean(v3) AS v3 FROM tbl GROUP BY id4 对许多大基数组求平均值,按整数分组
分组 #5 SELECT id6, sum(v1) AS v1, sum(v2) AS v2, sum(v3) AS v3 FROM tbl GROUP BY id6 对许多小组求和,按整数分组
高级分组 #1 SELECT id4, id5, quantile_cont(v3, 0.5) AS median_v3, stddev(v3) AS sd_v3 FROM tbl GROUP BY id4, id5 quantile_cont 对中等基数组进行操作,按整数分组
高级分组 #2 SELECT id3, max(v1)-min(v2) AS range_v1_v2 FROM tbl GROUP BY id3 对小基数组进行范围选择,按整数分组
高级分组 #3 SELECT id6, v3 AS largest2_v3 FROM (SELECT id6, v3, row_number() OVER (PARTITION BY id6 ORDER BY v3 DESC) AS order_v3 FROM x WHERE v3 IS NOT NULL) sub_query WHERE order_v3 <= 2 高级分组查询
高级分组 #4 SELECT id2, id4, pow(corr(v1, v2), 2) AS r2 FROM tbl GROUP BY id2, id4 对中等大小组进行算术运算,按 varchar、整数分组。
高级分组 #5 SELECT id1, id2, id3, id4, id5, id6, sum(v3) AS v3, count(*) AS count FROM tbl GROUP BY id1, id2, id3, id4, id5, id6 许多小组,组的数量是数据集的基数
连接 #1 SELECT x.*, small.id4 AS small_id4, v2 FROM x JOIN small USING (id1) 将大表 (x) 与小表按整数类型连接
连接 #2 SELECT x.*, medium.id1 AS medium_id1, medium.id4 AS medium_id4, medium.id5 AS medium_id5, v2 FROM x JOIN medium USING (id2) 将大表 (x) 与中等大小表按整数类型连接
连接 #3 SELECT x.*, medium.id1 AS medium_id1, medium.id4 AS medium_id4, medium.id5 AS medium_id5, v2 FROM x LEFT JOIN medium USING (id2) 将大表 (x) 与中等大小表按整数类型左连接
连接 #4 SELECT x.*, medium.id1 AS medium_id1, medium.id2 AS medium_id2, medium.id4 AS medium_id4, v2 FROM x JOIN medium USING (id5) 将大表 (x) 与中等大小表按 varchar 类型连接
连接 #5 SELECT x.*, big.id1 AS big_id1, big.id2 AS big_id2, big.id4 AS big_id4, big.id5 AS big_id5, big.id6 AS big_id6, v2 FROM x JOIN big USING (id3) 将大表 (x) 与大表按整数类型连接。

您可以在 数据处理效率 幻灯片中找到有关查询的更多信息。

基准测试与硬件的修改

对查询或数据生成没有进行任何修改。一些脚本需要进行少量修改,以便可以运行当前版本的库。所使用的硬件略有不同,因为基准测试以前使用的确切 AWS 产品已不再可用。基本库也已更新。未测试 GPU 库。

AWS 是 m4.10xlarge

  • CPU 型号:Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40 GHz
  • CPU 核心:40
  • RAM 型号:未知
  • 内存:160 GB
  • 无 GPU 规格
  • R 已升级,4.0.0 -> 4.2.2
  • Python 已升级 3.[6|7] -> 3.10

对其他系统安装脚本的更改

Pandas、Polars、Dask 和 ClickHouse 的安装/设置脚本需要更改。这些更改相对较小,主要包括语法更新和数据摄取更新。数据摄取不影响报告计时结果。

结果

您也可以查看结果。自 v0.2.7(两年多前发布)以来,DuckDB 的计时已显著提高。我们性能提升的主要贡献者是 2022 年 3 月合并的并行分组聚合并行结果集物化。此外,DuckDB 现在支持枚举类型,这使得 DuckDB 的 group by 聚合速度更快。对核外哈希连接的改进也已合并,进一步提升了我们连接的性能。

对某些结果有疑问?

某些解决方案可能会对某些查询报告内部错误。您可以通过使用 repro.sh 脚本 来调查错误,并提交 GitHub issue 以解决任何困惑。此外,代码中有许多地方会自动使某些查询结果为空。如果您认为您的系统存在此类查询情况,或者您有任何其他问题,可以创建 GitHub issue 进行讨论。

维护计划

DuckDB 将在可预见的未来继续维护此基准测试。使用更新的库版本重新运行基准测试的过程仍有待确定。

您还有其他问题吗?您希望将您的系统添加到基准测试中吗?请随时阅读仓库中的 README,如果您仍有疑问,可以通过 [email protected] 或我们的 Discord 联系我!