TPC-DS是一个数据仓库的基准测试,由Transaction Processing Performance Council(TPC)定义。TPC是一个非营利性组织,由数据库社区在20世纪80年代末成立的,其目标是开发可以客观地用于通过模拟真实世界场景来测试数据库系统性能的基准。TPC已经对数据库行业产生了重大影响。
"帮助决策"(Decision Support)是TPC-DS中的"DS"所代表的含义。TPC-DS共包含99个查询,从简单的聚合到高级模式分析。
1. 我们已经公开分享了我们对 Delta 基准测试框架的修改[8],以支持通过 Spark Datasource 或 Spark SQL 创建 Hudi 表。这可以在基准定义中动态切换。
2. TPC-DS 加载不涉及更新。Hudi 加载的 databeans 配置使用了不适当的写入操作 upsert
,而明确记录[9]了 Hudi bulk-insert
[10] 是此用例的推荐写入操作。此外,我们调整了 Hudi parquet 文件大小设置以匹配 Delta Lake 默认值。
- CREATE TABLE ...
- USING HUDI
- OPTIONS (
- type = 'cow',
- primaryKey = '...',
- precombineField = '',
- 'hoodie.datasource.write.hive_style_partitioning' = 'true',
- -- Disable Hudi’s record-level metadata for updates, incremental processing, etc
- 'hoodie.populate.meta.fields' = 'false',
- -- Use “bulk-insert” write-operation instead of default “upsert”
- 'hoodie.sql.insert.mode' = 'non-strict',
- 'hoodie.sql.bulk.insert.enable' = 'true',
- -- Perform bulk-insert w/o sorting or automatic file-sizing
- 'hoodie.bulkinsert.sort.mode' = 'NONE',
- -- Increasing the file-size to match Delta’s setting
- 'hoodie.parquet.max.file.size' = '141557760',
- 'hoodie.parquet.block.size' = '141557760',
- 'hoodie.parquet.compression.codec' = 'snappy',
- – All TPC-DS tables are actually relatively small and don’t require the use of MT table (S3 file-listing is sufficient)
- 'hoodie.metadata.enable' = 'false',
- 'hoodie.parquet.writelegacyformat.enabled' = 'false'
- )
- LOCATION '...'
Hudi 的起源[11]植根于增量数据处理,以将所有老式批处理作业变成增量[12]。因此,Hudi 的默认配置面向增量更新插入和为增量 ETL 管道生成更改流,而将初始负载视为罕见的一次性操作。因此需要更加注意加载时间才能与 Delta 相媲美
可以清楚地看到,Delta 和 Hudi 在 0.11.1 版本中的误差在 6% 以内,在当前 Hudi 的 master* 中误差在 5% 以内(我们还对 Hudi 的 master 分支进行了基准测试,因为我们最近在 Parquet 编码配置中发现了一个错误[13] 已及时解决)。为 Hudi 在原始 Parquet 表之上提供的丰富功能集提供支持,例如:
• 增量处理[14](因为在时间戳 t 提交)
• 记录级索引[15](支持记录级查找、更新和删除),
还有更多,Hudi 在内部存储了一组额外的元数据以及每条称为元字段[16]的记录。由于 tpc-ds 主要关注快照查询,在这个特定的实验中,这些字段已被禁用(并且未计算),Hudi 仍然将它们保留为空值,以便在未来打开它们而无需模式演进。添加五个这样的字段作为空值,虽然开销很低,但仍然不可忽略。
正如我们所见,Hudi 0.11.1 和 Delta 1.2.0 的性能几乎没有区别,而且 Hudi 目前的 master 速度要快一些(~5%)。您可以在 Google Drive 上的此目录中找到原始日志:
• Hudi 0.11:加载[17]/查询[18]
• Hudi master:加载[19]/查询[20]
• Delta 1.2.0:加载[21]/查询[22]
• Delta 2.0.0 rc1:加载[23]/查询[24]
要重现上述结果,请使用我们在 Delta 基准存储库[25] 中的分支并按照自述文件中的步骤进行操作。
总而言之,我们想强调开放性和可重复性在性能基准测试这样敏感和复杂的领域的重要性。正如我们反复看到的那样,获得可靠和值得信赖的基准测试结果是乏味且具有挑战性的,需要奉献、勤奋和严谨的支持。展望未来,我们计划发布更多内部基准测试,突出显示 Hudi 丰富的功能集如何在其他常见行业工作负载中达到无与伦比的性能水平。敬请关注!
在这个基准测试中,我们使用了Delta 1.0和Iceberg 0.13.0,环境配置列于下表。
如前所述,我们使用了Delta Oss的开源TPC-DS基准测试[5],并对其进行了扩展以支持Iceberg。我们记录了Load性能,也就是将数据从Parquet格式加载到Delta/Iceberg表中所需的时间。然后,我们也记录了Query性能。每个TPC-DS查询被运行三次,使用平均运行时间作为结果。
在完成基准测试后,我们发现无论是Load还是Query,整体性能都是Delta更优,因为它比Iceberg快3.5倍。将数据加载到Delta并执行TPC-DS查询需要1.68小时,而Iceberg则需要5.99小时。
当从Parquet文件加载数据到两种格式时,Delta在整体性能上比Iceberg快1.3倍。
为了进一步分析Load性能的结果,我们深入研究了每张表的详细加载结果,并注意到当表的大小变大时,加载时间的差异会变大。例如,当加载customer表时,Delta和Iceberg的性能实际上是一样的。另一方面,在加载store_sales表,也就是TPC-DS基准中最大的表之一时,Delta比Iceberg快1.5倍。
这表明,在加载数据时,Delta比Iceberg更快、扩展性更好。
在执行TPC-DS查询时,Delta的整体性能比Iceberg快4.5倍。在Delta上执行所有查询需要1.14小时,而在Iceberg上执行同样的查询需要5.27小时。
Iceberg和Delta在query34、query41、query46和query68中表现出基本相同的性能。在这些查询中的差异小于1秒。
然而,在其他的TPC-DS查询中,Delta都比Iceberg快,而且差异水平各有不同。
在一些查询中,如query72,Delta比Iceberg快66倍。
而在其他的查询中,Delta和Iceberg之间的差异在1.1倍到24倍之间,都是Delta更快。
在运行该基准测试后,Delta在可扩展性和性能方面都超过了Iceberg,并且幅度有时候意想不到地大。这个基准测试对我们和我们的客户来说提供了一个明确的答案,在构建数据湖仓时应该选择哪种解决方案。
同样需要指出的是,Iceberg和Delta都在不断地改进,随着他们的改进,我们将持续关注他们的性能表现,并在更广泛的社区分享我们的结果。
如果你希望进一步分析并从这个基准测试结果中提炼你的见解,你可以在这里下载完整的基准测试报告[6]。
原文地址:
https://databeans-blogs.medium.com/delta-vs-iceberg-performance-as-a-decisive-criteria-add7bcdde03d