本文字数:1684;估计阅读时间:5分钟
审校:庄晓东(魏庄)
本文在公众号【ClickHouseInc】首发
介绍
在 ClickHouse,我们热衷于基准测试和性能优化。所以当我第一次看到 Hacker News 上那篇“查询大型 JSON 文件的最快工具是用 Python 编写的”帖子时,我的第一个想法是——“但 clickhouse-local 不是用 Python 编写的”。让我们来看一下这个基准测试,证明 clickhouse-local 实际上是查询大型 JSON 文件的最快工具。
clickhouse-local
clickhouse-local 是一个单一的二进制文件,允许你使用 SQL 快速处理本地和远程文件,提供了无数据库的数据库功能。除了支持 ClickHouse 的所有功能外,它还支持多种文件格式,包括 JSON。下面我们尝试可视化 ClickHouse 集群、单个 ClickHouse 实例和 clickhouse-local 之间的区别:
性能基准测试
SPySQL 的创建者 Daniel Moura 发布了一项作为 SPySQL 项目一部分的基准测试。该基准测试比较了几种命令行工具,重点是查询可以存储在标准机器磁盘上但可能无法完全放入内存的大文件。测试数据集使用了亚马逊书评数据集的 10GB 子集。基准测试中使用的工具包括 SPySQL、jq、trdsql、Miller、OctoSQL、spark-sql、Pandas 和 DSQ。基准测试主要包含 3 个挑战:
-
Map:
为所有行计算一个新列(批量输入和输出都很大)。
这代表了一种常见的 ETL 类任务,涉及数据清洗和丰富。
-
Aggregation/Reduce:
计算一列所有行的平均值(只有输入很大)。
适用于需要快速分析结果且想避免将数据加载到如 ClickHouse 这样的数据存储中的用户。
-
Subset/Filter:
返回符合过滤条件的列的前 100 个值(只需要处理部分输入)。
此测试评估工具快速采样文件的能力,代表用户在迭代查询前常执行的任务。
初步测试结果显示 SPySQL 是查询大型 JSON 文件的最快工具:
但 Daniel 并不知道 clickhouse-local。为此,ClickHouse 最近引入了两个新功能,使处理 JSON 文件和复现此基准测试变得更加简单:支持半结构化数据存储和自动模式推断。后者允许 ClickHouse 从数据中推断列类型,因此用户无需指定 JSON 文件的结构和每个字段的类型,从而简化了语法并加速了入门体验。
在联系 Daniel 后,他迅速将 clickhouse-local 添加到他的基准测试中并更新了结果。令人惊讶的是,clickhouse-local 比之前的所有工具都快。OctoSQL 的一位开发人员(用 Go 编写)也要求根据最新改进更新基准测试,并取得了不错的结果。下图展示了更新后的基准测试结果。
Map 测试
1GB 数据的测试结果
聚合(reduce)测试
1GB 数据的测试结果
过滤(subset)测试
1GB 数据的测试结果
结果总结
更新的结果已经发布在此。可以看到,clickhouse-local 在查询大型 JSON 文件时速度远超大多数其他工具,而 OctoSQL 在处理较小文件时表现优异。
这个基准测试并不完美。每个查询只运行一次,因此可能会有波动,用户在本地硬件上重现结果时可能会发现运行之间的明显差异。结果也可能由于硬件和操作系统的差异而有所不同。最后,Daniel 在过滤查询中故意没有使用 ORDER BY 子句。虽然这可能导致不同工具之间的结果不同,因为 SQL 并不强制默认顺序,但基准测试的目标是评估用户希望尽快对文件进行采样以及工具避免完全扫描的能力。这个测试对那些在满足 LIMIT 后支持早期终止并且不需要将整个文件加载到内存中的工具有利。
所以,下次你需要处理大型 JSON 文件时,就知道该用哪个工具了!
征稿启示
面向社区长期正文,文章内容包括但不限于关于 ClickHouse 的技术研究、项目实践和创新做法等。建议行文风格干货输出&图文并茂。质量合格的文章将会发布在本公众号,优秀者也有机会推荐到 ClickHouse 官网。请将文章稿件的 WORD 版本发邮件至:Tracy.Wang@clickhouse.com
联系我们
手机号:13910395701
邮箱:Tracy.Wang@clickhouse.com
满足您所有的在线分析列式数据库管理需求