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

博客 / 产品

ClickHouse 22.2 版本发布

author avatar
Alexey Milovidov
2022 年 2 月 24 日

clickhouse-22-2-featured.jpeg

我们准备了新的 ClickHouse 22.2 版本,如果您在 2022 年 2 月 22 日尝试过,那真是太好了。如果没有,今天就可以试用。此最新版本包含来自 118 位贡献者的 2140 个新提交,其中包括 41 位新贡献者

Aaron Katz、Andre Marianiello、Andrew、Andrii Buriachevskyi、Brian Hunter、CoolT2、Federico Rodriguez、Filippov Denis、Gaurav Kumar、Geoff Genz、HarryLeeIBM、Heena Bansal、ILya Limarenko、Igor Nikonov、IlyaTsoi、Jake Liu、JaySon-Huang、Lemore、Leonid Krylov、Michail Safronov、Mikhail Fursov、Nikita、RogerYK、Roy Bellingan、Saad Ur Rahman、W、Yakov Olkhovskiy、alexeypavlenko、cnmade、grantovsky、hanqf-git、liuneng1994、mlkui、s-kat、tesw yew isal、vahid-sohrabloo、yakov-olkhovskiy、zhifeng、zkun、zxealous、박동철。

让我告诉您 22.2 中最有趣的内容…

投影已投入生产

投影使您能够在同一张表中拥有多个数据表示。例如,您可以在原始数据旁边拥有数据聚合。对可使用的聚合函数没有限制 - 您可以在其中拥有去重计数、分位数或任何您想要的东西。您可以在多个不同的排序顺序中拥有数据。ClickHouse 将自动为您查询选择最合适的投影,因此查询将自动优化。

投影在某种程度上类似于物化视图,物化视图也允许您进行增量聚合和多个排序顺序。但与物化视图不同,投影与主表一起以原子方式和一致方式更新。投影数据存储在表的相同“数据部分”中,并以与主数据相同的方式合并。

此功能由著名的 ClickHouse 贡献者 Amos Bird 开发。该 原型 自 2021 年 2 月起可用,它已由 Nikolai Kochetov 于 2021 年 5 月在实验性标志下合并到主代码库中,并且经过 21 次后续拉取请求,我们确保它通过了所有测试套件并默认启用。

阅读有关如何使用投影优化查询的示例 在我们的文档中

控制数据导出时文件创建和重写

当您使用 INSERT INTO TABLE FUNCTION 语句将数据导出到 files3hdfs 中,并且目标文件已存在时,您现在可以控制如何处理它:如果可以,您可以将新数据追加到文件中,用新数据重写它,或创建另一个具有类似名称的文件,例如“data.1.parquet.gz”。

某些存储系统(如 s3)和某些格式(如 Parquet)不支持数据追加。在以前的 ClickHouse 版本中,如果您多次插入带有 Parquet 数据格式的文件,您最终会得到其他系统无法识别的文件。现在,您可以在后续插入时选择抛出异常或创建更多文件。

因此,引入了新的设置

s3_truncate_on_insert
s3_create_new_file_on_insert
hdfs_truncate_on_insert
hdfs_create_new_file_on_insert
engine_file_allow_create_multiple_files

此功能 Pavel Kruglov 开发。

自定义去重令牌

ReplicatedMergeTreeMergeTree 类型表实现了块级去重。当插入数据块时,会计算其密码哈希,如果之前已插入相同的块,则跳过重复项并插入查询成功。这使得能够为插入实现一次性语义。

在 ClickHouse 22.2 版本中,您可以提供自己的去重令牌,而不是自动计算的哈希。如果您已经从其他系统获得批处理标识符,并且想要重复使用它们,那么这样做是有意义的。当块可能相同但实际上应多次插入时,这样做也有意义。或者相反 - 当块包含一些随机数据时,您只想通过重要列进行去重。

这是通过添加设置 insert_deduplication_token 实现的。此功能由 Igor Nikonov 贡献。

INSERT 的 DEFAULT 关键字

一个小的 SQL 兼容性补充 - 现在我们允许在 INSERT INTO ... VALUES 语句中使用 DEFAULT 关键字代替值。看起来像这样

INSERT INTO test VALUES (1, 'Hello', DEFAULT)

感谢 Andrii Buriachevskyi 提供此功能。

EPHEMERAL 列

表中的列可以具有 DEFAULT 表达式,例如 c INT DEFAULT a + b。在 ClickHouse 中,如果您希望始终使用提供的表达式计算该列,而不是允许用户插入数据,您也可以使用 MATERIALIZED 代替 DEFAULT。如果您不希望存储该列,而是希望在引用时动态计算该列,则可以使用 ALIAS

从 22.2 版本开始,添加了一种新的列类型:EPHEMERAL 列。用户可以向此列中插入数据,但该列不会存储在表中,它是短暂的。此列的目的是提供数据来计算其他列,这些列可以使用 DEFAULTMATERIALIZED 表达式引用它。

此功能由 Yakov Olkhovskiy 制作。

多磁盘配置改进

您可以配置多个磁盘来存储 ClickHouse 数据,而不是管理 RAID,ClickHouse 将自动管理数据放置。

从 22.2 版本开始,ClickHouse 可以通过从副本下载缺失的部分并将它们放置在正常磁盘上,在不重启服务器的情况下自动修复损坏的磁盘。

此功能由 Amos Bird 实现,并且已经使用超过 1.5 年在快手生产环境中使用。

另一个改进是指定 TTL MOVE TO DISK/VOLUME IF EXISTS 的选项。它允许具有不均匀磁盘配置的副本,并且允许一个副本将旧数据移动到冷存储,而另一个副本将所有数据都放在热存储中。数据将仅移动到具有指定磁盘或卷的副本上,因此为 if exists。这是由 Anton Popov 开发的。

灵活的内存限制

我们将每个查询和每个用户的内存限制拆分为一对硬限制和软限制。设置 max_memory_usagemax_memory_usage_for_user 充当硬限制。当内存消耗接近硬限制时,将抛出异常。另外两个设置:max_guaranteed_memory_usagemax_guaranteed_memory_usage_for_user 充当软限制。

如果存在可用内存,查询将被允许使用超过软限制的内存。但如果内存不足(相对于每个用户的硬限制或服务器总内存消耗),我们会计算“超额提交率”——每个查询相对于软限制消耗了多少额外内存——我们会杀死超额提交最多的查询,让其他查询运行。

简而言之,如果您有数百 GB 可用内存,您的查询不会被限制为几个 GB 的 RAM。

此实验性功能由 **Dmitry Novik** 实现,并且正在不断开发中。

SQL 中的 Shell 样式注释

现在我们允许以 # #! 开头的注释,类似于 MySQL。带有 #! 的变体允许使用由 clickhouse-local 解释的“shebang”的 shell 脚本。

此功能由 **Aaron Katz** 贡献。非常棒。

还有更多...

Maxim Kita、Danila Kutenin、Anton Popov、zhanglistar、Federico Rodriguez、Raúl Marín、Amos Bird 和 Alexey Milovidov 为此版本贡献了大量的性能优化。和往常一样,我们痴迷于高性能。

阅读 22.2 版本的完整变更日志,并关注 路线图.

分享此帖子

订阅我们的时事通讯

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