DoubleCloud 即将停止服务。迁移到 ClickHouse,享受限时免费迁移服务。立即联系我们 ->->

博客 / 工程

ClickHouse 23.5 版本发布

author avatar
ClickHouse 团队
2023 年 6 月 21 日

版本发布持续进行。

我们非常高兴地分享 23.5 版本中的一系列令人惊叹的功能。

此外,我们已经确定了 23.6 版本的发布日期,请立即注册参加 6 月 29 日上午 9:00(PDT)/ 下午 6:00(CEST)的社区电话会议。

版本概要

29 个新功能。22 项性能优化。85 个错误修复。

下面列出了一些突出功能的子集。但值得注意的是,一些功能现在已准备好投入生产或已默认启用。您可以在本文末尾找到这些功能。

Azure 表函数 (Alexander Sapin, Smita Kulkarni)

ClickHouse 的资深用户会熟悉 s3gcs 函数。从实现的角度来看,这两个函数几乎完全相同,后者最近被添加仅仅是为了让希望查询 Google GCS 的用户更容易理解。两者都允许用户查询存储在基于 s3 的 Blob 存储中的文件,无论是 就地查询还是用作数据源 以插入到 ClickHouse 的 MergeTree 表中。

虽然 GCS 与 S3 几乎完全互操作,但 Azure 等效的 Blob 存储产品与 S3 规范略有不同,并且 需要更多工作

在 23.5 版本中,我们很高兴地宣布 azureBlobStorage 表函数可用于查询 Azure Blob 存储。用户现在可以查询 Azure Blob 存储中任何 受支持格式 的文件。此函数的参数与其 S3 和 GCS 函数略有不同,但提供了类似的功能。请注意,我们需要指定连接字符串、容器和 Blob 路径以与 Azure Blob 存储概念 保持一致。在下面的示例中,我们查询 英国房价数据集

SELECT
	toYear(toDate(date)) AS year,
	round(avg(price)) AS price,
	bar(price, 0, 1000000, 80)
FROM azureBlobStorage('https://clickhousepublicdatasets.blob.core.windows.net/', 'ukpricepaid', 'uk_price_paid_*.parquet', 'clickhousepublicdatasets', '<key>')
GROUP BY year
ORDER BY year ASC

┌─year─┬──price─┬─bar(round(avg(price)), 0, 1000000, 80)─┐
│ 199567938 │ █████▍                             	│
│ 199671513 │ █████▋                             	│
│ 199778543 │ ██████▎                            	│
│ 199885443 │ ██████▊                            	│
│ 199996041 │ ███████▋                           	│
│ 2000107493 │ ████████▌                          	│
│ 2001118893 │ █████████▌                         	│
│ 2002137958 │ ███████████                        	│
│ 2003155894 │ ████████████▍                      	│
│ 2004178891 │ ██████████████▎                    	│
│ 2005189362 │ ███████████████▏                   	│
│ 2006203535 │ ████████████████▎                  	│
│ 2007219376 │ █████████████████▌                 	│
│ 2008217044 │ █████████████████▎                 	│
│ 2009213424 │ █████████████████                  	│
│ 2010236115 │ ██████████████████▉                	│
│ 2011232807 │ ██████████████████▌                	│
│ 2012238384 │ ███████████████████                	│
│ 2013256926 │ ████████████████████▌              	│
│ 2014280027 │ ██████████████████████▍            	│
│ 2015297287 │ ███████████████████████▊           	│
│ 2016313551 │ █████████████████████████          	│
│ 2017346516 │ ███████████████████████████▋       	│
│ 2018351101 │ ████████████████████████████       	│
│ 2019352923 │ ████████████████████████████▏      	│
│ 2020377673 │ ██████████████████████████████▏    	│
│ 2021383795 │ ██████████████████████████████▋    	│
│ 2022397233 │ ███████████████████████████████▊   	│
│ 2023358654 │ ████████████████████████████▋      	│
└──────┴────────┴────────────────────────────────────────┘

29 rows in set. Elapsed: 9.710 sec. Processed 28.28 million rows, 226.21 MB (2.91 million rows/s., 23.30 MB/s.)

对于任何表函数,将等效的表引擎用于用户希望像查询其他表一样查询数据源的情况通常是有意义的。如所示,这简化了后续查询。

CREATE TABLE uk_price_paid_azure
ENGINE = AzureBlobStorage('https://clickhousepublicdatasets.blob.core.windows.net/', 'ukpricepaid', 'uk_price_paid_*.parquet', 'clickhousepublicdatasets', '<key>')

SELECT
	toYear(toDate(date)) AS year,
	round(avg(price)) AS price,
	bar(price, 0, 1000000, 80)
FROM uk_price_paid_azure
GROUP BY year
ORDER BY year ASC

┌─year─┬──price─┬─bar(round(avg(price)), 0, 1000000, 80)─┐
│ 199567938 │ █████▍                             	│
│ 199671513 │ █████▋                             	│
│ 199778543 │ ██████▎                            	│

29 rows in set. Elapsed: 4.007 sec. Processed 28.28 million rows, 226.21 MB (7.06 million rows/s., 56.46 MB/s.)

与 S3 和 GCS 函数类似,我们也可以使用这些函数将 ClickHouse 数据写入 Azure Blob 存储容器,从而帮助解决导出和反向 ETL 使用案例。

INSERT INTO FUNCTION azureBlobStorage('https://clickhousepublicdatasets.blob.core.windows.net/', 'ukpricepaid', 'uk_price_paid_{_partition_id}.parquet', 'clickhousepublicdatasets', '<key>') PARTITION BY toYear(date) SELECT * FROM uk_price_paid;

在上面的示例中,我们使用 PARTITION BY 子句和 toYear 函数,并为每一年创建一个 Parquet 文件。

希望此功能能够为我们的用户解锁项目。上述功能的限制在于它仅在接收节点上执行,从而限制了可以分配给查询的计算量。为了解决这个问题,我们正在积极开发 azureBlobStorageCluster 函数。这在概念上等同于 s3Cluster,后者通过利用通配符模式跨集群分发 S3 存储桶中文件的处理。敬请关注(并加入版本发布网络研讨会)以获取更新!

我们要感谢 Jakub Kuklis 在 2021 年为 Azure 提供了 VFS 级集成,并得到了 Kseniia Sumarokova 的审查和支持。

ClickHouse Keeper 客户端 (Artem Brustovetskii)

去年我们发布了 ClickHouse Keeper,以提供与 ClickHouse 集群协调系统关联的数据的强一致性存储,并且对于允许 ClickHouse 作为分布式系统运行至关重要。这支持诸如数据复制、分布式 DDL 查询执行、领导者选举和服务发现等服务。ClickHouse Keeper 与 ZooKeeper 兼容,ZooKeeper 是 ClickHouse 中用于此功能的传统组件。

ClickHouse Keeper 已准备好投入生产。ClickHouse Cloud 正在大规模运行 clickhouse-keeper 以支持多租户环境中的数千个 ClickHouse 部署。

到目前为止,用户可以通过使用 nczkCli.sh 等工具直接通过 TCP 发送命令来与 ClickHouse Keeper 通信。虽然这足以进行基本的调试,但这使得管理任务的用户体验不佳,而且很不方便。为了解决这个问题,我们在 23.5 版本中引入了 keeper-client - 一个内置于 ClickHouse 的简单工具,用于检查您的 ClickHouse Keeper。

为了尝试使用该客户端,我们可以使用我们最近 发布的 Docker Compose 文件(由我们的支持团队提供),快速启动一个多节点 ClickHouse 集群。在下面的示例中,我们启动了一个包含单个复制分片和 3 个 Keeper 实例的 2 节点部署。

[email protected]:ClickHouse/examples.git
export CHKVER=23.5
export CHVER=23.5
cd examples/docker-compose-recipes/recipes/cluster_1S_2R/
docker-compose up 

以上在端口 9181、9182 和 9183 上公开了我们的 Keeper 实例。使用客户端连接非常简单:

./clickhouse keeper-client -h 127.0.0.1 -p 9181
/ :) ruok
imok
/ :) ls
clickhouse keeper
/ :)

用户还可以利用类似于 ClickHouse 客户端的 --query 参数进行 Bash 脚本编写。

./clickhouse keeper-client -h 127.0.0.1 -p 9181 --query "ls/"
clickhouse keeper

更多可用选项,请参阅 此处

Parquet 读取速度更快 (Michael Kolupaev)

最近,我们 发表了关于改进 的博文,这些改进与 Parquet 文件的查询有关。我们认为,这是使 ClickHouse 成为全球查询 Parquet 文件最快工具的旅程的开始,无论是通过 ClickHouse Local 还是 ClickHouse 服务器。对最近通过利用行组并行读取 Parquet 的工作不满意,23.5 版本增加了进一步的改进。

大多数改进都与低级工作相关,通过 避免互斥锁 来提高并行读取的效率。正如我们在博客中提到的,我们历史上也按顺序读取 Parquet 行,这固有地限制了读取速度。此限制现已消除,并且默认情况下使用乱序读取。虽然这不会影响大多数用户(除了他们的查询速度更快!),因为分析查询通常不依赖于读取顺序,但用户如果需要可以通过设置 input_format_parquet_preserve_order = true 回到旧的行为。

例如,考虑以下在包含早期英国房价数据集所有行的单个 Parquet 文件上执行早期查询的情况 - 此文件可以从 此处 下载。

--23.4

SELECT
	toYear(toDate(date)) AS year,
	round(avg(price)) AS price,
	bar(price, 0, 1000000, 80)
FROM file('house_prices.parquet')
GROUP BY year
ORDER BY year ASC

29 rows in set. Elapsed: 0.367 sec.

--23.5

SELECT
	toYear(toDate(date)) AS year,
	round(avg(price)) AS price,
	bar(price, 0, 1000000, 80)
FROM file('house_prices.parquet')
GROUP BY year
ORDER BY year ASC

29 rows in set. Elapsed: 0.240 sec.

对于基于 ClickHouse 数据编写 Parquet 文件的用户,有三种主要方法 - 使用 INTO OUTFILEINSERT INTO FUNCTION 或简单地将 SELECT FORMAT Parquet 重定向到文件。从历史上看,我们建议用户使用后两种方法中的后者,主要是因为 INTO OUTFILE 可能会生成非常大的行组大小,这是由于一些不太理想的内部行为造成的。这将影响后续读取性能。这可能是一个难以调试的复杂问题,需要深入了解 Parquet。幸运的是,这个问题现在已经得到解决 - 您可以像使用其他格式一样自由地使用 INTO OUTFILE

虽然以上所有内容都代表着重大的改进,但这段旅程尚未结束。我们仍然需要进一步改进一些查询 - 特别是查询单个大型 Parquet 文件。对于感兴趣的用户,请关注我们在 ClickBench 上关于 Parquet 的公开基准测试

clickbench_parquet.png

总结

如引言中所述,现在有几个功能已默认启用或被视为生产就绪(不再是实验性的)。特别是,地理数据类型(PointRingPolygonMultiPolygon)和函数(距离、面积、周长、联合、交集、凸包等)现在在 23.5 中已准备好投入生产!

此外,磁盘上的压缩标记和索引(首次在 22.9 中可用)现在默认可用。服务器启动后的第一个查询从未如此快速。

最后但同样重要的是,查询结果缓存现在被认为是“生产就绪”的。我们已经在题为“ClickHouse 查询缓存简介”的文章中详细介绍了此功能。查询缓存基于这样一个理念:有时某些情况下,缓存昂贵的 SELECT 查询的结果是可以接受的,以便可以从缓存中直接服务后续执行的相同查询。

新贡献者

特别欢迎所有 23.5 的新贡献者!ClickHouse 的流行在很大程度上归功于社区的贡献。看到社区不断发展总是令人谦卑。

如果您在这里看到您的名字,请与我们联系……但我们也会在 Twitter 等平台上找到您。

Alexey Gerasimchuck,Alexey Gerasimchuk,AnneClickHouse,Duyet Le,Eridanus,Feng Kaiyu,Ivan Takarlikov,Jordi,János Benjamin Antal,Kuba Kaflik,Li Shuai,Lucas Chang,M1eyu2018,Mal Curtis,Manas Alekar,Misz606,Mohammad Arab Anvari,Raqbit,Roman Vlasenko,Sergey Kazmin,Sergey Kislov,Shane Andrade,Sorck,Stanislav Dobrovolschii,Val Doroshchuk,Valentin Alexeev,Victor Krasnov,Vincent,Yusuke Tanaka,Ziy1-Tan,alekar,auxten,cangyin,darkkeks,frinkr,ismailakpolat,johanngan,laimuxi,libin,lihaibo42,mauidude,merlllle,ongkong,sslouis,vitac,wangxiaobo,xmy,zy-kkk,你不要过来啊

分享此文章

订阅我们的新闻通讯

及时了解功能发布、产品路线图、支持和云产品信息!
正在加载表单…
关注我们
Twitter imageSlack imageGitHub image
Telegram imageMeetup imageRss image