分类
uncategorized

ClickHouse 2020 RoadMap

Clickhouse 2020 RoadMap,文档为俄文,翻译自 Google Translate

官网原文

翻译:文档为俄文,翻译自 Google Translate

这是2020年的重要任务。其中许多都在GitHub Issues上。该文本应被视为工作草案,其中对任务,链接和材料的概述和简要描述可在一页上进行快速访问。任务的分类是有条件的。

由于ClickHouse是开源产品,因此我们希望工作流程尽可能开放。因此,您应该希望此页面上的工作流细节比您想象的要多-与开发人员看到的工作流一样近。由于开发过程中不可或缺的一部分是修复产品缺陷并提高代码质量,因此在此页面上,您会找到这些详细信息的非常详细的描述。对于其他开源产品,这种开发方法通常并不常见。由于指出了每个任务的依赖性,因此您可以了解需要进行哪些准备工作,从而可以更准确地了解实施时间表。

1.数据存储,索引

1.1。 Z阶曲线索引,归一化的Z阶曲线

#6286

该任务也属于类别“ 17。因为geoHash是z-Order曲线的特例,所以使用地理数据”。
还与任务24.27的半重复行的模糊搜索有关,因为它将允许对min-hash进行索引。
透视图中的“标准化z阶曲线”任务对于BC和Metrica很有用,因为它允许混合OrderID和PageID并避免数据重复。
该问题还引入了一种索引方法,该方法通过在间隔上反转几个自变量的函数来进行索引,这对于进一步开发是有意义的。

经济学院安德烈·楚尔科夫(Andrey Chulkov)。

1.2。 +等待数据库目录

Q2。由Alexander Tokmakov制作,于2019年12月推出首个工作版本。DataLens和Yandex.Metrica所需。

数据库目录操作:CREATE TABLE,DROP TABLE,RENAME TABLE和DATABASE查询需要使用锁进行同步。由于许多内部数据结构都依赖于此同步,因此它变得相当复杂。

提出了一种替代方法,其中表和数据库仅是对持久对象的引用。详细的任务描述:#6787

更新。大部分任务已经完成,但是值得关注第二季度。
更新。拉取请求已准备好进行合并。
更新。糟透了20.4。在标记allow_experimental_database_atomic下可用。

1.3。 +无阻塞ALTER

Q1。和完全不变的碎片。作者:亚历山大·萨平(Alexander Sapin)。我准备在2019年11月底开始任务。Yandex.Metrica必需。

更新。大多数任务已完成并添加到母版中。有少量技术债务。剩下的就是对表元数据进行非阻塞更改的实现。
更新。一切都已完成,在20.6版中有望完成。

1.4。 +非传递性ALTER栏

需要1.3。亚历山大·萨平(Alexander Sapin)将做到。好了,做完了。

1.5。 + ALTER RENAMECOLUMN¶

#6861

1.6。 +多态数据块

紧凑的零件-Q1,零件Q1 / Q2 RAM-项目1.7。

已实现紧凑块,默认情况下尚未启用。第一步是为系统表启用默认值。

更新。包含在系统表中。

安东·波波夫(Anton Popov)于12月发布了第一个工作版本。降低小型INSERT的复杂性的先决条件,而这对于1.12是必需的,否则1.12任务将无法正常工作。对于Yandex.Cloud尤其必要。

ClickHouse中MergeTree类型的表中的数据存储为一组独立的“块”。在块内部,每一列以及索引都存储在单独的文件中。这样做是为了实现对列的快速操作(例如,ALTER DROP COLUMN查询)。插入数据(INSERT)时,将创建一个新块。对于具有大量列的表,具有少量行的INSERT查询是无效的,因为它们需要在文件系统上创建大量文件。这是ClickHouse的固有功能-用户面临的第一个问题。在将数据插入ClickHouse之前,用户必须缓冲数据并将其收集为大批。

为了减轻此问题的影响,ClickHouse提供了Buffer表。它们在写入另一个表之前将数据累积在RAM中。但是,由于以下原因,缓冲区表不是完整的解决方案:-插入时存在锁; -插入数据的重新排序; -从Buffer到结果表的非原子传输。

取而代之的是,建议允许诸如MergeTree之类的表段以不同的格式排列数据。即:-在RAM中; -在磁盘上,所有列都在一个文件中; -在具有单独文件中的列的磁盘上:取决于块大小和经过的时间。要将块放置在RAM中,您还必须实现对预写日志的可选支持,并带有用于刷新到磁盘的可自定义规则。这将消除使用小插入MergeTree表的问题。对于ReplicatedMergeTree表,这只能部分解决问题。

1.7。 + MergeTree中的缓冲和WAL

需要1.6。安东·波波夫(Anton Popov)。任务已完成。 Q2。
有一个拉取请求。
更新。在代码审查阶段。
更新。从20.6版开始可在实验模式下使用。

1.8。 +通过TTL在各部分之间传输

弗拉基米尔·切博塔列夫(Alvinity) 2019年12月。

Q1。承诺,但现在正在纠正技术债务。
做完了不,尚未准备好-仍然存在技术债务。

1.9。 +使用TTL进行数据抽取

Nikolay Sorokin,HSE和Yandex。
更新。有一个拉取请求。更新。做完了

现在,用户可以在表中设置一个表达式,该表达式确定存储数据的时间。通常,此表达式是相对于date列的值指定的-例如:三个月后删除数据。 https://clickhouse.tech/docs/ru/operations/table_engines/mergetree/#table_engine-mergetree-ttl

可以为整个表(然后在指定的时间后删除整个行)或为单个列(然后从磁盘上物理删除列数据,并保留表中的行;在读取列值时将它们作为默认值)进行设置。

但是用户还需要此功能的更高级版本:不要删除整个行或列,而是将它们稀疏化-剩下更少的行。

这里有几个选项:
1.随着时间的流逝,每隔N行离开一次。
2.随着时间的推移,执行数据聚合,用几行中一组值中的聚合函数的值替换某些列的值。

点1无关紧要,因为已经使用TTL表达式删除数据来实现它。作为该表达式,您可以编写例如cityHash64(*)%10 = 0?现在():event_time + INTERVAL 3 MONTH。事实真是不方便。

但是第二点需要考虑。创建表时甚至不清楚使用哪种语法。但我们会提出-几个选项立即可见。

1.10。 +后台压缩旧数据

在大师的帮助下,由亚历山大·萨平(Alexander Sapin)制作,https://github.com/ClickHouse/ClickHouse/pull/14494

将由经济高等学校的Kirill Barukhov完成,于2020年春季进行实验实施。Yandex.Metrica需要。

压缩算法(例如LZ77)使您可以花费更多时间压缩数据,以便更强大地压缩数据,而不会降低数据解压缩速度。特别是,在ClickHouse中使用的LZ4和ZSTD具有此属性。这样,当服务器未加载时就可以使用空闲的CPU资源来压缩数据,以使数据占用更少的磁盘空间,同时保持甚至提高查询处理速度。

同时,ClickHouse通常用于脉冲负载情况。使用所有CPU资源,将尽快处理来自用户的请求,但是平均而言,服务器的负载不足。

建议将数据压缩设置和执行此任务的后台线程添加到ClickHouse。

更新。提供了未知准备程度的原型。

1.11。 +虚拟文件系统

Log,TinyLog,StripeLog以及MergeTree已转移到VFS,这证明了实现的一致性。

Yandex.Cloud需要。由Alexander,Yandex.Cloud制作。

ClickHouse使用本地文件系统来存储数据。在某些情况下,在远程文件系统上放置旧(存档)数据将是有益的。如果文件系统与POSIX兼容,那么这不是问题:ClickHouse可成功与Ceph,GlusterFS,MooseFS一起使用。还需要使用S3(由于云中的可用性)或HDFS(与Hadoop集成)的场景。但是这些文件系统不符合POSIX。尽管有适用于他们的FUSE驱动程序,但它们的性能会受到很大影响,并且支持不完整。

ClickHouse使用FS功能的一小部分,但同时又包含一些特定的部分:符号链接和硬链接,O_DIRECT。建议将与文件系统的所有交互都分离到一个单独的接口中。

1.12。通过S3和HDFS的VFS的实验实现

Q4。

Yandex.Cloud需要。需要1.11。理想的是1.6和1.18。
由Alexander,Yandex.Cloud(S3的第一部分)以及Oleg Ershov,HSE和Yandex制造。

更新。 Oleg仅会做HDFS部分。
更新。 S3之上的实现在PoC级别上可行。
更新。 S3之上的实现速度非常慢,现在正在完成中。
更新。在HDFS之上的实现由AmosBird负责快手。

1.13。 +使用FINAL加快查询速度

需要2.1。尼古拉·科切托夫(Nikolay Kochetov)着。 Yandex.Metrica需要。 Q2。
更新:PR#10463

1.14。不要写包含全零的列

安东·波波夫(Anton Popov)。 Q4。
队列。一个简单的任务,这是潜在的半结构化数据支持的一个小前提。
更新。读取列切片后排队。

1.15。在不同的块中具有不同的主键的能力

艰巨的任务,只有在1.3之后。
更新。在讨论中。
更新。我带阿莫斯·伯德(Amos Bird)上班。描述了该概念。与1.16相同。

1.16。一件数据的多种物理表示

仅在1.3和1.6之后才是艰巨的任务。允许补偿21.20。
更新。在讨论中。
更新。我带阿莫斯·伯德(Amos Bird)上班。描述该概念,在初期阶段就可以工作。

1.17。一张桌子有多种分类

仅在1.3和1.6之后才是艰巨的任务。
更新。在讨论中。
更新。我带阿莫斯·伯德(Amos Bird)上班。描述了该概念。与1.16相同。

1.18。 -单独存储块文件

需要1.3和1.6。用符号链接完全替换硬链接,这对于1.12会更好。
取消。

2.主要重构

为了证明需要,请参阅其他任务说明中的链接。

2.1。 +更改对处理器的请求的执行管道

尼古拉·科切托夫(Nikolay Kochetov)着。发展的最后阶段。默认情况下于2019年12月底启用。于2020年初删除旧代码。

更新。当前,在某些情况下,性能下降的问题已修复。似乎所有问题都已解决。
默认情况下,此功能在Q1中已启用,但是剩下第二部分的任务是正确提取异步部分。

更新。默认启用。删除旧代码的时间不得早于第一个发行版,默认情况下已启用该功能,但仍可以将其关闭。

更新。已经有默认情况下启用此功能的第一个版本。

更新。我们仍在等待旧代码的删除,旧代码应在20.4发布之后进行。

更新。大多数旧代码已被删除。

2.2。事件/指标/限制/配额/跟踪的基础结构

队列。 https://gist.github.com/alexey-milovidov/d62d73222d83b9319dc519cbb13aeff6

2.3。将柱状ser / de从DataType移到Column

队列。安东·波波夫(Anton Popov)。

2.4。将LowCardinality从DataType转换为Column。添加ColumnSparse

需要2.3。

2.5。版本化聚合函数的状态

队列。描述了实现方案。阿列克谢·米洛维多夫(Alexey Milovidov)。

2.6。 IN的右侧为数据类型。将IN作为标量子查询执行

需要2.1。
取消。

2.7。 +上下文标准化

队列。 YQL需要。

Alexander Tokmakov解决了Context的许多问题,现在正在将数据库目录移到外部。

更新。数据库目录已从上下文中删除。
更新。从上下文中删除了SharedContext。
更新。该问题已被中和,不再相关。
更新。一般而言,一切正常。

2.8。声明式查询解析器

中优先级。 YQL需要。

更新。队列。伊万·勒赞金(Ivan Lezhankin)。
更新。任务处于最后阶段。到目前为止,它仅被视为替代解析器,其描述适用于第三方应用程序。

2.9。 +以格式样式登录

#6049

做完了

2.10。查询表不是列,而是片

队列。
正在进行中,第四季度的安东·波波夫(Anton Popov)。

2.11。 -解析和归一化位图的功能

队列。
不相关。

2.12。声明性函数签名

#3775

该任务由Alexey Milovidov完成。进度为50%,开发暂时停止。

更新。发展仍处于停滞状态。

2.13。每个功能在单独的文件中

该任务由Alexey Milovidov完成。进度80%。您将需要其他开发人员的帮助。

更新。观察到侵害。

2.14。将所有有状态功能更改为FunctionBuilder

债务尼古拉·科切托夫(Nikolay Kochetov)。该代码当前处于过渡状态,这是不可接受的。

2.15。 IStorage的订阅功能¶

为了规范化合并,分布式,Kafka之上的物化视图的工作。

3.文件

这里的任务仅适用于文档基础结构。

3.1。将功能文档移入代码

需要2.12和2.13。我们想要Q2,中等优先级。

3.2。将同类文档移到代码中

需要3.1。

3.3。 +修复灾难性的令人不快的不当文档搜索

伊万·布林科夫(Ivan Blinkov)是一个非常好的人。文档站点本身基于难以修复的技术不足。该任务将由我们遇到的第一个前端开发人员来完成,我们可以强迫他们这样做。

更新。伊万·布林科夫(Ivan Blinkov)通过用普通垃圾技术代替垃圾技术来完成这项任务。

3.4。 +在文档中添加日语

该任务将由Ivan Blinkov完成,直到2019年12月结束。完成。

4.联网

4.1。减少分布式请求的线程数

2020年春季。更新。有一个原型。更新。他不工作。更新。该人放弃了任务,但截止日期尚未确定。

4.2。推测执行多个副本上的查询

Yandex.Metrica需要。需要4.1。

如果分布式请求影响大量服务器,则由于尾部延迟,请求的执行时间通常会变长-个别服务器偶尔会变慢。可以通过将同一请求立即发送到多个副本并使用最快的数据来避免此问题。

该任务本身隐藏了许多与请求执行阶段的处理有关的细节(连接,握手交换,发送请求,接收结果标头,接收进度包,接收数据),配置超时的正确能力以及对请求的正确取消。

现在,对于分布式请求,将在每个连接的每个流中使用它。这使得可以很好地并行化接收数据的计算并利用网络,但是对于大型群集,它变得高度冗余。例如,创建1000个线程从1000个群集服务器读取数据只会消耗资源,并增加查询执行时间。相反,必须使用不超过处理器内核数量的线程数,并在一个线程中与服务器进行多路通信。该实现并非易事,因为有必要在网络上复用每个通信阶段,包括建立连接和交换握手。

更新。现在正在讨论如何代替此任务执行另一项任务。

4.3。限制从副本同时下载的数量

最初,它是由Oleg Alekseenkov完成的,但是解决方案尚未准备好,尽管在那里没有太多要完成的事情。

4.4。复制带宽限制

需要度量。

4.5。失败后能够在复制期间继续传输大量数据

4.6。 GLOBAL子查询的p2p传输

4.7。为k和v查询设置IN和JOIN的延迟加载

4.8。拆分背景池以进行提取和合并

队列。修复正在恢复的副本停止合并的问题。部分补偿4.3。

5.运作

5.1。 +在Clickhouse复印机中将任务拆分为较小的块

#9075
Q1。符合Metrica的需要。尼基塔·米哈伊洛夫(Nikita Mikhailov)。

更新。该任务处于开发的最后阶段。
更新。做完了这项工作的有效性尚有疑问。有一些方法可以更好地做到这一点。

5.2。 +自动调整RAM限制和缓存大小

5.3。 +普罗米修斯集成把手

做完了https://github.com/Vdimir

5.4。选择启用通知客户端是否发布了新版本

有倾向。

5.5。 + LTS版本

需要7.5。 Metrica,Cloud,BC,Market和Altinity需要此任务。第一个LTS版本已经成为版本19.14。
Metrica,BC,Market,Altinity已经使用了比LTS更新的版本。
更新。 LTS的第二个版本-20.3已经出现。

6.仪器仪表

6.1。 +修复了采样查询分析器

Mikhail Filimonov,Altinity。 2019年11月。完成。
仍然需要检查第一个线程中探查器的性能(这对于INSERT很重要)。伊万·勒赞金(Ivan Lezhankin)。 Q1。做完了

6.2。 +添加内存分析器

#6387

相对简单的任务,但仅适用于经验丰富的开发人员。每个人都需要。伊万·勒赞金(Ivan Lezhankin)。 Q1。做完了

6.3。 +扩展总RAM帐户,不仅用于请求

用RAM校正漂移的长期存在的问题。 Metrica和BC需要。

6.4。 +支持性能事件作为查询指标

经济学院安德烈·斯科布佐夫(Andrey Skobtsov)着。

在Linux中,可以在程序中获取有关性能计数器和与CPU和OS内核相关的事件的信息。有关详细信息,请参见man perf_event_open。建议将这些指标添加到ClickHouse中以检测查询。

有一个原型。
做完了

6.5。尝试LLVM X射线

需要2.2。

6.6。 +堆栈跟踪是否有任何异常

现在,几乎所有(但不是全部)异常都有堆栈跟踪。需要7.4。

6.7。 +表system.stack_trace

相对简单的任务,但仅适用于经验丰富的开发人员。

6.8。 +表系统崩溃

相对简单的任务,但仅适用于经验丰富的开发人员。
更新。在发展中。

6.9。 +如果服务器因信号崩溃而向客户端发送信息

做完了

6.10。收集通用系统指标

7.开发支持

7.1。 +子模块中的ICU

Arcadia(7.26)也需要添加到子模块。

7.2。 +子模块中的LLVM

由Alexey Milovidov制造。

7.3。 + Poco更新

亚历山大·库兹曼科夫(Alexander Kuzmenkov)。

7.4。 +包含libc ++,libc ++-使用gcc构建时为abi

当前仅在使用clang构建时启用,但生产构建使用gcc。
需要7.2,可能需要7.1(仅在较新的ICU版本中)。

7.5。 +开始发布LTS版本

亚历山大·萨平

7.6。 +在Clickhouse-Performance-Test中为比较模式校正统计测试

Dmitry Rubashkin(HSE)开始执行任务。现在,亚历山大·库兹曼科夫继续。完成,在CI中工作。长期以来,尚未确定测试结果的可靠标准。现在问题已解决,但某些问题仍未解决。

7.7。 + MSan的完成测试

我们已经有ASan,TSan和UBSan。没有足够的MSan测试。它们已被添加到CI,但是没有通过。
亚历山大·库兹曼科夫(Alexander Kuzmenkov)和亚历山大·托克马科夫(Alexander Tokmakov)。

更新。任务仍在缓慢拖延。
更新。由Alexey Milovidov完成。

7.8。 +添加整洁

我们已经有PVS-Studio。我们非常满意,但这还不够。

更新。阿列克谢·米洛维多夫(Alexey Milovidov)。添加了很多检查,但是您需要连续考虑所有检查并添加所有可能的检查。
更新。连续考虑所有检查。

7.9。 +使用clang-tidy检查命名样式

做完了仅在.cpp文件中,并且仅对于本地变量名称。剩下的太复杂了。

7.10。在集成测试中启用UBSan和MSan

UBSan包含在功能测试中,但不包含在集成测试中。需要7.7。

7.11。 +在单元测试中包括* San

与功能测试相比,我们只有很少的单元测试,并且它们的使用是可选的。但是无论如何它们都是重要的,没有理由不让它们在各种消毒剂下运行。

伊利亚·逸神做完了

7.12。显示PR中新代码的测试范围

现在,仅显示所有代码的测试覆盖率。
推迟了

7.13。 +在gcc中包含-Weverything类似物

我们正在使用-Wall -Wextra -Weverything -Werror。
使用clang进行构建时,-Weverything已包含在内。但是gcc有独特的警告,clang没有。
由Wolf Kreuzerkrieg制造。

7.14。 + readline和libedit的替代方法

连接replxx而不是readline由Ivan Lezhankin进行。

Unicode联盟文件许可证存在技术债务。
\ G在多行模式下工作存在技术债务。

7.14.1。 +互动模式Clickhouse-Client的改进

Tagir Kuskarov,高等经济学院。

更新。作为此任务的一部分,我们添加了语法突出显示并解决了插入大查询时遇到的问题。
更新。添加了最低亮点,但未完成其他任务。

readline或libedit库用于在clickhouse-client命令行客户端中以交互方式输入查询。

readline和libedit库具有以下缺点:
-(已在新的readline版本中修复)在插入大块文本时性能很差。插入每个下一个字符的复杂度为O(n =上一个字符的数量),并且在插入1 MB文本时,速度下降到每秒数十个字节。
-在键入时实现语法高亮以及自动完成而不按其他键来调用是非常困难或不可能的。
-GPL许可证(用于readline)禁止将其包含在产品代码库中。
-如果历史记录包含屏幕上不适合的查询,则历史记录导航将无法正常工作。
-仅在客户端退出时保存历史记录
-当多个客户端与一个历史记录文件并行工作时,仅保存一个客户端的历史记录。
-历史记录不适用于多行查询。
-传输数据的经济性过高,这通常会导致终端中残留垃圾。

此外,还有以下优点很难实现:
-支持从右到左的文本;
-支持editrc配置。

另外,您可以考虑以下选项:
-Salvatore Sanfilippo的Linenoise。优点:代码的简单性和紧凑性;高工作速度。缺点:不支持Unicode。没有自动文本换行,这使得使用多行查询变得困难。
-具有Unicode支持补丁的Linenoise。缺点:失去了速度优势。
-鱼壳。这不是一个库,而是一个如何实现语法突出显示和方便的自动完成功能的绝佳示例。支持Unicode,但速度较慢。
-Python提示工具包。不适合将其集成到C ++项目中。良好的语法突出显示和自动完成功能。

取而代之,建议作为示例来检查Kilo文本编辑器的原型:https://viewsourcecode.org/snaptoken/kilo/并实现所有必要的功能。

7.15。 +将libressl替换回openssl

使用libressl的原因是我们知名公司n的好朋友的渴望

7.16。 +二进制内部的tzdata

与在Arcadia中一样,回退到系统。

7.17。 +完整的tgz软件包

长期以来,通用tgz软件包已经组装完毕,但是由于一次荒唐的意外,安装脚本从其中消失了。
亚历山大·萨平可以将此任务委托给任何人。
更新。除网站上的说明外,其他所有步骤均已完成。这需要在repo.yandex.ru中创建测试/稳定/稳定目录。突然发现负责此事的人正在休假,他没有回答代理人是谁的问题。 Q1。

7.18。 +适用于Mac的完整二进制文件

已经为Mac的每次提交和PR自动生成了二进制文件,但存在缺陷。
伊万·勒赞金(Ivan Lezhankin)。需要7.1、7.2。推荐7.14。现在至少缺少SSL和ICU。 Yandex.Cloud需要。
更新。由SSL制成。我们在第一季度得到了指导,但是优先级是中等的,可能会丢失。

7.18.1。在网站上放置指向Mac的已编译二进制文件的链接

现在人们必须点击几下才能下载它们。
亚历山大·萨平
更新。在文档中添加了直接链接和说明。但是,该网站的主页上仍然没有说明。

7.19。 +完成(检查)AArch64自动组装

https://github.com/ClickHouse/ClickHouse/issues/8027#issuecomment-566670282
我们在实际的华为服务器上以及在内部包含qemu-user-static的特殊Docker容器中进行了检查。
您还可以在Cavium,Raspberry Pi以及Android手机上进行检查。

7.20。 +为FreeBSD x86_64自动构建

伊万·勒赞金(Ivan Lezhankin)。

更新。在实施过程中,存在拉取请求。
更新。有组件,例如
该网站上仍然没有说明!

7.21。自动为Linux ppc64构建

伊万·勒赞金(Ivan Lezhankin)。
莫名其妙地慢慢拖下去。
不知何故,它根本不会拖累。我们还同意,我们将为MIPS64做另一个自动组装。

7.22。 +用于拉取请求的仪表板

达里亚·彼得罗娃(Daria Petrova),UrFU。

工作原型:https://pulls-dashboard-demo.herokuapp.com/dashboard/ClickHouse/ClickHouse
更新。我们在日常工作中使用此工具。

大量开发人员同时在ClickHouse上工作,他们以请求请求的形式注册其更改。当有很多苛刻的请求时,组织工作变得很困难-不清楚首先要看哪个请求。

建议实现一个简单的单页Web应用程序,该应用程序显示具有以下信息的拉取请求列表:
-差异大小-更改的行数;
-最近一次更新是多久以前的;
-修改文件的类型:C ++,文档,构建脚本;
-存在附加测试;
-是否有变更日志的描述;
-更改了子模块;
-是否允许启动CI检查;
-CI检查的状态;
-审稿人批准的数量;

检查状态是最重要的部分。由于每个PR都要进行几十次检查,而最慢的检查则要花几个小时,因此您必须:
-以漂亮的彩色矩阵的形式一次显示每个PR的所有检查,并带有鼠标悬停的信息;
-按重要性对检查进行排序:例如,如果外部开发人员通过了除代码样式以外的所有检查,那么我们可以自行进行检查;
-如果对于上一次提交的检查已完成,而对于上一次提交的检查仍在进行中,则可以在表中以褪色显示上一次检查的状态。

建议实现几个分类选项。就更新时间而言,显而易见的是,更有趣的是,某种程度的排名是为了找出“现在最好投入工作的”。

例如,已经有类似的产品:http://prs.mozilla.io/yandex:ClickHouse不幸的是,该产品已被放弃,不能完全满足需要。您可以自行决定从中获取一些有用的信息。

7.23。 +模糊功能

经济高等学校的安德烈·内卡谢维奇(Andrey Nekrashevich)。

模糊测试是使用随机数据进行测试。我们将考虑完成此任务的几种方法:

将函数添加到ClickHouse的SQL方言中以生成随机数据(例如,给定长度的随机二进制字符串,随机有效的UTF-8字符串)和“破坏”数据(例如,以给定的频率更改随机位的值)。这将用于测试ClickHouse SQL函数。
您可以添加功能:
randomString(长度)
randomFixedString(长度)
-具有给定长度且均匀分布的随机字节的字符串;
randomStringASCII(长度)
randomStringUTF8(长度)

fuzzBits(s,inverse_probability)-以指定的概率将字符串的每一位更改为相反的一位;
fuzzBytes(s,inverse_probability)-将字符串的每个字节更改为具有指定概率的均匀随机字节;

每个函数都有一个可选参数,用于拒绝在查询中连接相同的表达式。

您也可以使用确定性随机数生成器(将种子作为参数传递)来创建函数,以实现测试用例的可重复性。

更新。 Sergey Shtykov制作了randomPrintableASCII函数。
更新。 Ilya Yatsishin制作了generateRandom表函数。
更新。 Eldar Zaitov添加了OSS Fuzz。
更新。由跑

7.24。模糊词法分析器和查询解析器;编解码器和格式

延续7.23。

使用AFL或LibFuzzer测试ClickHouse代码库的特定部分。

对随机数据的语法上正确的随机查询的生成和执行。

更新。亚历山大·库兹曼科夫(Alexander Kuzmenkov)根据AST突变创建了一个请求相位器。

7.25。 +与Arcadia的发布同步

最初,Oleg Alekseenkov进行了研究。他现在搬到了友好部门,但是他保证会保持同步。
然后,也许是伊万·莱詹金(Ivan Lezhankin)。但是现在搁置了,因为YT的Maxim需要修复索引分析中的性能回归。

YT的格言(Maxim)说,他将在新的一年之后这样做。
YT的Maxim表示:“我们计划在一月份实现。”
Maxim现在通过新版本的ClickHouse收集YT。

CHYT和YQL需要。

更新:Maxim的所有补丁已发送给主服务器。任务已完成。
Upd:任务正在执行中。主机将同步。伊万·莱詹金(Ivan Lezhankin)制作
Upd:有一个原型正在组装,但是组装似乎尚未在Arcadia的后备箱中。
更新:添加到Arcadia,但不是所有文件(不是字节)。
更新:按字节添加所有文件。

7.26。 +具有Arcadia的存储库的字节标识

DevTools团队。该任务的进展情况尚有疑问。
更新。完成(除contrib以外的所有目录)。

7.27。 +在Arcadia中启动自动测试

需要7.26。同事们已经开始做,有结果。
更新。一小部分测试在阿卡迪亚进行部分测试。这就足够了。

7.29。 +选项Clickhouse安装,停止,启动,而不是postinst,init.d,systemd脚本

低优先级。

7.30。能够在生产中切换二进制文件而无需布置软件包

低优先级。

7.31。镜像服务器之间的负载

队列。 Yandex.Metrica需要。

7.32。 +混淆生产要求

罗马·伊尔戈夫斯基Yandex.Metrica需要。
有一个拉取请求:https://github.com/ClickHouse/ClickHouse/pull/10973
做完了

使用SQL查询时,需要显示将在其上执行该查询的表的结构,并用随机数据填充这些表,以使该查询的结果取决于数据子集的选择。

例如,如果有一个SELECT SearchPhrase,在表WHERE CounterID = 34 AND SearchPhrase LIKE’%ClickHouse%’中进行计数(*),则可以得出CounterID是数字类型,而SearchPhrase是字符串类型。用某些条件满足某些条件CounterID = 34和SearchPhrase LIKE’%ClickHouse%’的数据填充表,而不满足某些条件的数据。

查询混淆:具有秘密查询和表结构,替换字段名称和常量,以便将查询用作公开可用的测试。

更新。最后一部分尚未完成,将单独完成。

7.33。自动将补丁程序版本上传到存储库

队列。伊万·勒赞金(Ivan Lezhankin)。
没有进步。

7.34。 +自动反向修正错误

队列。伊万·勒赞金(Ivan Lezhankin)。
有进步。
做完了

7.35。自动合并的初始规则

绿色检查和两个评论。
亚历山大·萨平可以将此任务委托给任何人。

7.36。受信任的贡献者概念

具有5个合并PR的贡献者。对于新的PR,将立即启动自动测试。
亚历山大·萨平可以将此任务委托给任何人。
现在,我们手动添加了一些受信任的贡献者。
更新。仍在手动模式下添加。

7.37。 +处理repo.yandex.ru

抱怨装载速度和维护,操作,可见度的不便。

更新。伊万·布林科夫(Ivan Blinkov)设立了CDN repo.clickhouse.tech,从而解决了国外可访问性的问题。
操作问题,可见性仍然相关。

更新。可见性问题已得到部分解决-存在某种仪表板。

8.与外部系统集成

8.1。对Kafka的ALTER MODIFY SETTING支持

另外-可以在Kafka中指定所有格式设置。

高度没有人正在执行此任务。

8.2。 -Mongo Atlas URI支持

亚历山大·库兹曼科夫(Alexander Kuzmenkov)。
更新。任务已完成。
所有拉取请求已成功关闭。

8.3。 +改进glob(正确支持范围,减少并发流的数量)

奥尔加·赫沃斯蒂科娃(Olga Khvostikova)。

减少流的数量已完成,但没有正确支持范围。让我们对Q1 / Q2充满希望。做完了

8.4。 URL下的统一文件,HDFS,S3

8.5。 + S3中的身份验证

弗拉基米尔·切博塔列夫(Vladimir Chebotarev),Altinity。

8.6。 HDFS和Kafka的Kerberos身份验证

Andrea Konyaev,ArenaData。他不见了。
更新。卡夫卡正在进行中。

8.7。 +在非常老的Linux内核上修复HDFS琐事

2.6内核缺少hdfs3不必要使用的一个系统调用。
由Amos Bird制造。

8.8。 +支持带有文件名和路径的虚拟列

奥尔加·赫沃斯蒂科娃(Olga Khvostikova)。

8.9。 +支持压缩文件(gz,bz)进行读写

安德烈·博德罗夫(Andrey Bodrov)

8.10。 +写入ODBC表函数

HSE的Artemy Bobrovsky
有一个拉取请求。

8.11。 +用于从Mongo读取的表引擎

HSE的Artemy Bobrovsky
有一个拉取请求。
更新。在代码审查阶段。
做完了

8.12。跳过Parquet,ORC格式的列

已实施,可能已部分实施-检查。

8.13。支持Parquet,ORC中的数组

8.14。 +将数据写入ORC

帕维尔·克鲁格洛夫(Pavel Kruglov),高等经济学院。有一个拉取请求。做完了

8.15。将数据写入CapNProto

推迟了

8.16。 +支持Avro格式

安德鲁·奥尼舒克(Andrew Onyshchuk)。有一个拉取请求。 Q1。做完了

Apache Avro格式是具有外部架构的紧凑,结构化的逐行二进制数据格式。该格式通常与Kafka结合使用,并且用户需要它作为ClickHouse中I / O格式之一的支持。

8.16.1。 +支持将JSONEachRow格式插入数组

Pavel Kruglov,高等经济学院和Yandex。有一个拉取请求。

8.16.2。 -节俭格式支持

Pavel Kruglov,高等经济学院和Yandex。任务已取消。

8.16.3。 +支持MsgPack格式

Pavel Kruglov,高等经济学院和Yandex。
任务已完成。

更新。差不多完成了-只有很少的技术债务。
更新。做完了

8.16.4。 + Regexp格式

Pavel Kruglov,高等经济学院和Yandex。
有一个拉取请求。做完了

8.17。 + ClickHouse作为MySQL副本

该任务由BohuTANG完成。

实现订阅基于行的MySQL复制并将接收到的数据存储在CollapsingMergeTree或ReplacingMergeTree表中的功能。已经存在用于此任务的第三方解决方案:https://www.altinity.com/blog/2018/6/30/realtime-mysql-clickhouse-replication-in-practice还有PostgreSQL的第三方解决方案:https:// github。 com / mkabilov / pg2ch

充当ClickHouse内置的MySQL副本的功能将为进一步开发提供优势。

8.18。 + ClickHouse作为联合MySQL

Maxim Fedotov,Wargaming和Yuri Baranov,Yandex。

8.19。 +与RabbitMQ集成

Ksenia Sumarokova,高等经济学院。

ClickHouse通常使用从分布式队列导入流数据。最常用于Kafka。这个机会已经存在。

需求的下一个是RabbitMQ排队系统。 ClickHouse不支持它。

正在开发一个请求请求。
更新。在代码审查过程中。
更新。做完了

8.20。 -与SQS集成

低优先级。取消。

8.21。 -支持任意数量的区域名称语言

公元前需要。 2019年12月。
在12月,为卑诗省制作了此问题的最小版本。
似乎没有人需要最大选项。
更新。看来该任务是不必要的。
取消。

8.22。 +对MySQL样式变量的语法支持

解析请求时,将@@ version_full语法转换为对getGlobalVariable(’version_full’)函数的调用。支持流行的MySQL变量。如果有热情,也许尤里·巴拉诺夫(Yuri Baranov)会有所帮助。

更新。尤里·巴拉诺夫(Yuri Baranov)在Google工作,禁止在那里开发ClickHouse。
更新。由不受禁止的ClickHouse开发人员制作。

8.23。用于将更新后的日志和循环日志导入FS的订阅

理想的是2.15。
推迟了

9.安全性

9.1。 +对外部系统请求中主机的限制

米哈伊尔·科罗托夫(Mikhail Korotov)。

9.2。预先配置的到外部数据库的命名连接

ClickHouse提供了从查询语言访问外部数据库的功能。这被实现为表函数。该表函数的参数指定远程数据库的地址(主机,端口)以及认证数据(用户名,密码)。身份验证数据以明文形式显示在请求中,因此进入请求历史记录和日志,这会危及系统的安全性。

而是建议在服务器配置文件或单独的服务中描述必要的数据,并按名称引用它们。

9.3。 +对ZooKeeper的TLS支持

#10174

有一个拉取请求。

10.外部词典

10.1。 +修复YT访问库中的冻结

用于访问YT的库没有经验。
BC和指标需要。搜索原因-亚历山大·萨平。在YouTube一侧可以进行进一步的校正。

Quote:“事实证明,YT客户端挂几分钟是正常的。删除了内部托盘,减少了超时。肯定会好起来的。”

10.2。 +修复YT访问库中的SIGILL

YT代码使用SIGILL而不是中止。同样,这是在练习中发生的。
BC和指标需要。搜索原因-亚历山大·萨平。在YouTube一侧可以进行进一步的校正。

更新。消除了一个原因,但其他原因仍然未知。
更新。由于旧的库突然过时了,我们不得不将此库从一个API重写为另一个API。似乎重写将不小心解决所有问题。
更新。欢呼,我们找到了原因并解决了。

10.3。 -能够从YT词典中的静态表中读取数据

BC和指标需要。
取消。

10.4。 -来自YDB的字典(KikiMR)

对于Metrica来说是必要的,但是来自KikiMR团队的神秘陌生人会这样做(可疑)。这位神秘的陌生人没有确认他会做这项任务。

10.5。关闭连接并减少MySQL和ODBC的连接数

需要度量。

由ClémentRodriguez为MySQL制作。

10.6。 +来自Cassandra和Couchbase的词典

卡桑德拉已经准备好了。
Couchbase已取消,因为没有需求。
Aerospike值得怀疑。

10.7。字典中的可空支持

10.8。支持字典中的数组

10.9。 -由于同时请求相同的请求,减少了缓存字典的锁定

取而代之的是10.10、10.11。

10.10。 +能够在重新请求高速缓存字典时使用旧值

尼基塔·米哈伊洛夫(Nikita Mikhailov)。 Q1。 BC和指标需要。

10.11。 +缓存字典中完全异步请求的可能性

尼基塔·米哈伊洛夫(Nikita Mikhailov)。 Q1。 BC和指标需要。需要10.10。

10.12。 +字典直接布局

Artyom Streltsov,Nikolay Degterinsky,Natalia Mikhnenko,HSE。
我们开始了这项任务。
直接就绪,有一个拉取请求complex_key_direct。
全部都准备好了。

10.13。使用Join作为字典的通用布局

10.14。支持所有类型的转换功能

10.15。 +使用字典作为Join的专用布局

10.16。 +本地SSD上的字典

Nikita Vasiliev,HSE和Yandex。有一个拉取请求。

在ClickHouse中实现一个专用的表引擎,该表引擎适用于快速键值查询,并针对在SSD上存储数据进行了优化。它可以是:基于RocksDB的实现;具有内存索引的序列化RowBinary数据;我将要讨论的秘密高效数据结构。

将此数据结构用作单独的一种字典,作为高速缓存字典的源,或作为高速缓存字典的附加缓存级别。

更新。该任务处于准备就绪的最后阶段。

10.17。字典状态的本地转储,以快速启动服务器

推迟了

10.18。将远程服务器上的表或字典连接为高速缓存字典的数据库键值

10.19。可以使用自定义名称的字典来注册某些功能

推迟了

11.接口

11.1。作为参数元组或参数元组数组插入聚合函数的状态

11.2。开箱即用地使用JDBC引擎的能力

我们需要弄清楚如何将Java打包为静态二进制文件(可能是AppImage)。或提供安装jdbc-bridge的最简单说明。 Badoo的Alexander Krasheninnikov也许会感兴趣,因为他开发了jdbc-bridge。

更新。亚历山大·克拉森尼尼科夫(Alexander Krasheninnikov)移至另一家公司,不再参与。
更新。吴志春接任任务。

11.3。 +通过ODBC将ClickHouse自身连接到ODBC驱动程序的集成测试

Mikhail Filimonov,Altinity。做完了

11.4。修复Clickhouse-cpp中日期和小数类型的错误

Altinity完全取代了clickhouse-cpp驱动程序的支持。

11.5。 clickhouse-cpp中的TLS支持

您是否知道clickhouse-cpp库是由一个好人在业余时间开发的?

11.6。 Clickhouse-cpp集成测试

11.7。 Clickhouse本地互动模式

推迟了

11.8。 + PostgreSQL协议支持

HSE的Elbakyan Movses Andranikovich。

ClickHouse去年增加了对MySQL Wire协议的支持。 PostgreSQL和MySQL一样,在客户端和服务器之间使用简单的通信协议,但是它是自己的。需要对该协议的支持,这将为ClickHouse开辟新的机会。

该任务正在开发中。
该任务处于开发的最后阶段。

11.9。 + ODBC驱动程序的改进

丹尼斯·格拉扎切夫(Denis Glazachev),Altinity。在这项任务上进展良好。

11.10。 +针对请求的预配置HTTP处理程序

zhang2014,有一个拉取请求。

能够在配置文件中描述对服务器的HTTP请求的处理程序(URL中的路径),该处理程序对应于某些对

12.用户和访问管理

12.1。 +基于角色的访问控制

维塔利·巴拉诺夫(Vitaly Baranov)。开发的最后阶段,工作版本于2019年4月上旬。
Q2。现在,已经完成了代码和请求中的所有接口,但是除了原型之外,没有其他用于存储权限的选项。
更新。权利存储完成。现成状态有几处改进。

12.2。 +使用SQL查询管理用户和访问权限

维塔利·巴拉诺夫(Vitaly Baranov)。开发的最后阶段,工作版本于2019年12月。
Q1。权限管理已完成,但未实现其存储,请参见12.1。

12.3。从LDAP连接用户目录和访问权限

通过LDAP进行身份验证-Denis Glazachev。
维塔利·巴拉诺夫(Vitaly Baranov)和丹尼斯·格拉扎切夫(Denis Glazachev),Altinity。需要12.1。
Q3。
更新。在最后阶段拉取请求。

12.4。将Yandex IDM系统连接为用户和访问权限的目录

到目前为止,优先级较低。需要度量。需要12.3。
推迟了

12.5。使用Kerberos的可插入身份验证(可能是GSASL连接)

维塔利·巴拉诺夫(Vitaly Baranov)和丹尼斯·格拉扎切夫(Denis Glazachev),Altinity。需要12.1。
更新。有一个拉取请求。

12.6。 +系统表中有关用户和配额的信息

维塔利·巴拉诺夫(Vitaly Baranov)。需要12.1。
有一个拉取请求。 Q2。做完了

13.资源共享,多租户

13.1。过量使用内存请求和逐出

需要2.1。正在讨论实现方法。亚历山大·卡扎科夫(Alexander Kazakov)。

13.2。共享执行流水线到服务器

需要2.1。尼古拉·科切托夫(Nikolay Kochetov)。

13.3。资源池

亚历山大·卡扎科夫(Alexander Kazakov)。

需要13.2,否则我们可以更早地进行更尴尬的实现。
讨论了一种不便实现的变体。目前,将中等优先级定位于Q1 / Q2。
实施选项由Alexander Kazakov选择。
更新。他们没有跟踪,经理们开始讨论这个问题。
更新。亚历山大·卡扎科夫(Alexander Kazakov)研究了这个问题。
更新。任务已完成。
更新。该任务似乎已投入工作。

14. SQL方言

14.1。 +可为空的CAST语义的更正

需要DataLens。以及用于集成到BI的Looker工具中。

14.2。 +支持子查询

由Amos Bird制造。

14.3。支持替换IN右侧的集

14.4。支持替换SQL查询中的标识符(名称)

张2014
任务已暂停。

14.5。 +支持将集合设置为IN部分右侧的数组

Altinity的瓦西里·内姆科夫(Vasily Nemkov)完成了此任务,但放弃了它以支持其他任务。
结果,安东·波波夫(Anton Popov)现在完成了它。

14.6。 WITH的全球范围

在讨论中。阿莫斯鸟。

14.7。可以用于WITH ROLLUP,WITH CUBE和TOTALS

简单的任务。

14.8。 +修饰符DISTINCT,ORDER BY用于聚合函数

ClickHouse支持COUNT(DISTINCT x)的计算。建议为所有聚合函数添加使用DISTINCT修饰符的功能。例如AVG(DISTINCT x)-计算所有不同x值的平均值。一个值得怀疑的选择是,唯一值的过滤是由一个表达式执行的,而聚合是由另一个表达式执行的。

一些聚合函数的结果取决于数据的顺序。建议实现ORDER BY修饰符,该修饰符明确指定顺序。示例:groupArray(x ORDER BY y,z)。

更新。有拉取请求。
更新。 DISTINCT已准备就绪。
更新。 ORDER BY已取消,并且已经使用LIMIT重做。

14.9。 + EXPLAIN查询支持

需要2.1。尼古拉·科切托夫(Nikolay Kochetov)。
更新。有一个拉取请求。做完了

14.10。 arrayReduce作为高阶函数

14.11。分组功能

推迟了

14.12。时间序列处理功能

推迟了

这项艰巨的任务引入了新的功能类别,并且需要在查询优化器中进行处理。

在时间序列中,DBMS需要依赖于值序列的功能。甚至从一系列值及其时间戳记中。示例:移动平均,指数平滑,导数,Holt-Winters预测。 ClickHouse仅部分支持此类函数的计算。例如,ClickHouse支持“数组”数据类型,并允许将这些函数实现为接受数组的函数。但是,对于用户来说,将这样的功能应用于表(排序后的中间查询结果)将更加方便。

这就需要引入新的函数类(除了常规函数和聚合函数之外)-这些函数在ClickHouse代码中将具有自己的接口,并且在查询执行管道中必须分别考虑它们的计算。例如,普通功能的计算在处理器内核和服务器之间微不足道地并行化。聚合函数的计算具有一些特殊性(并行处理计算的中间状态,合并操作);对于用于处理时间序列的函数,此问题仍然存在-可能必须在一台服务器和一个线程中进行计算。

14.13。元组和嵌套的高阶函数的适用性

在“读取列切片”任务之后。

14.14。隐式常量类型转换

专为常数比较运算符而设计

15.改善JOIN支持

15.1。 +将合并的JOIN投入生产

Artyom Zuikov。现在,可以手动启用合并JOIN作为选项,并且始终会降低查询速度。我们希望它仅在不可避免的情况下才减慢请求的速度。
顺便说一句,合并JOIN的含义仅与15.2和15.3结合使用。
Q1。我们制作了一个自适应版本,但看起来它仍然会降低速度。
任务已完成,但一切工作太慢。

15.1.1。两级合并JOIN算法

也称为宽限哈希联接。
Artyom Zuikov。队列。

15.1.2。在Greenplum中测试JOIN实现

队列。好像任务已经取消了。

15.2。 OUTER JOIN中的投掷条件

也许是Artyom Zuikov,但任务尚未得到充分考虑。可能需要2.1。

15.3。对类似ON的链的推论t1.x = t2.y WHERE t1.x = 10

也许是Artyom Zuikov。对于成熟的工作15.2。

15.4。使用数据重新分配进行分布式JOIN

Artyom Zuikov。

15.5。使用表键优化合并JOIN

15.6。 + SEMI和ANTI JOIN

Artyom Zuikov。

=## 16.数据类型和功能

16.1。 + DateTime64

瓦西里·涅姆科夫(Vasily Nemkov),Altinity,2019年12月。

16.2。 JSON的数据类型

张2014

审查过程中有PR。

16.3。支持函数中带有正则表达式的非常量参数

Danila Kutenin,但只有在秘密更改工作之后才可以。
更新。工作中不会有秘密更改,该任务将由另一个人来完成。

16.4。 RowNumberForKey函数

16.5。 XML和HTML转义的功能

16.6。 +标准化和哈希SQL查询的功能

阿列克谢·米洛维多夫(Alexey Milovidov)。做完了

17.处理地理数据

17.1。 +地理词典,用于通过坐标确定区域

安德烈·库尔科夫(Andrey Chulkov),安东·克瓦莎(Anton Kvasha),阿图尔·彼得科霍夫斯基(Artur Petukhovsky),HSE。
将基于Arslan Urtashev的代码。

ClickHouse不是地理空间DBMS。但是,ClickHouse具有一些用于执行此类任务的功能。例如,pointInPolygon函数使您可以快速检查点是否落入平面上的多边形。同时,多边形被明确指定,并且在调用函数时必须是恒定的(即,检查多个点是否属于同一多边形)。例如,通过坐标对移动设备进行广告定位时需要此功能。

ClickHouse尚无法解决的类似但更困难的任务是确定要落入点的一组多边形中的一个多边形。例如:通过地理坐标定义城市区域。为了解决这个问题,有必要实现对具有多边形的字典的支持,在其中对数据进行索引以进行快速搜索。

更新。 Andrey制作了该接口的原型和其中的存根实现。
更新。安德烈(Andrey)制作了一个更优化的数据结构的原型。
更新。有令人鼓舞的结果。
更新。在审查中。
更新。发行中。

17.2。 GIS数据类型和操作

Yandex.Maps高等经济学院的Alexey Koryakov,Alexey Ilyukhov。

在ClickHouse中实现数据类型以处理地理信息数据:点,线,多线,多边形以及对其进行的操作-检查是否发生,相交。最小的选择是在欧几里得坐标系中执行这些操作。另外-在球体和WGS84上。

更新。有一个拉取请求。

17.3。 +加速度greatCircle距离

基于Andrey Aksyonov的代码的Olga Khvostikova,允许使用收到的代码。

17.4。使用Arcadia中的库加速geohash

获得管理部门的批准。

17.5。 +签入pointInPolygon函数

现在,该函数在具有自相交的多边形的情况下无法正常运行,必须抛出异常。

18.机器学习与统计

18.1。增量数据聚类

亚历山大·科日霍夫(Alexander Kozhikhov),马克西姆·库兹涅佐夫(Maxim Kuznetsov)。发现实施中的一个基本问题,据称完成了Nikolay Kochetov。他可以将任务委托给任何人。

纠正一个基本问题-有PR。
根本问题已经解决。

18.2。统计测试的汇总功能

Artyom Tsyganov,Konstantin Igorevich Rudensky,Denis Semyonov,HSE。

建议以汇总函数的形式在ClickHouse中实施统计测试(方差分析,正态分布测试等)。示例:welchTTest(值,sample_idx)。

我们做了两个测试的原型,有一个拉取请求。还有一个拉动请求来关联等级。
更新。我们已经暂停等级的相关性,但是还没有暂停比较t检验,u检验。

18.3。 ClickHouse中训练模型的基础架构

队列。
推迟了

19.改善集群性能

19.1。没有线性化的平行仲裁插入

更新。预计在十月初投入工作。

默认情况下,ClickHouse中的数据复制是异步的,没有专用的主机。这意味着插入数据的客户端在数据到达一台服务器后会收到成功的响应。其他服务器上的数据复制在不同的时间点执行。这是不可靠的,因为如果只有一台服务器丢失,它会使刚插入的数据丢失。

为了解决此问题,ClickHouse能够启用“仲裁”插入。这意味着在数据到达多个(仲裁)服务器之后,插入数据的客户端会收到成功的响应。确保线性化:数据到达多个副本后,客户端将收到成功的响应,这些副本包含使用仲裁插入的所有先前数据(此类副本可以称为“同步”),并且在SELECT查询期间,您可以设置一个仅从同步读取的设置副本。

如果没有线性化属性,则对于三个服务器A,B,C,仲裁值= 2,对于三个数据插入1,2,3,可能第一个插入到服务器A和B,第二个插入到服务器B和C,第三个服务器A和C,现在没有一个服务器包含完整的数据集1、2、3。

奇怪的是,大多数用户不需要此属性。它不允许平行插入。用户希望安全地(在多个副本上)插入数据,但是顺序无关紧要。建议提供一个禁用线性化的选项。

有时,用户希望手动实现仲裁插入:只需连接到多个副本并将相同的数据插入到其中(以确保可靠的插入而不受复制机制的工作原理的限制)。现在无法满足用户的期望。 ClickHouse具有重复数据删除机制,以确保插入的幂等性。具有相同数据(甚至到不同副本)的第二个插入将被忽略。我们需要确保,相反,将相同数据插入另一个副本具有与使用复制机制获取此数据相同的效果。

19.2。 Etcd或Consul连接作为ZooKeeper替代

Alexey Lyovushkin,HSE和Yandex。

为了协调ClickHouse中的副本,使用ZooKeeper。许多ClickHouse用户希望能够使用其他一些系统来代替ZooKeeper进行协调。此类系统考虑的选项包括Etcd,Consul,FoundationDB。这是非常成问题的,因为这些系统在接口和功能上有很大的不同。尽管如此,为了使此任务成为可能,与ZooKeeper交互的接口已在ClickHouse中进行了概括,现在可以用其他实现代替它。

去年,Alexey添加了ZooKeeper接口的模拟实现以进行测试。现在建议在Etcd之上进行实现,并扩展测试实现的功能。

更新。阿列克谢做出了一些改动,但他为没有任何效果的事实而苦苦挣扎。
更新。在初始阶段有一个拉取请求。
更新。已投入工作,但前景尚不清楚,因为尚不清楚某些细微差别是否需要校正。

19.3。 -连接YT Cypress或YDB作为ZooKeeper的替代方案

保持。对Yandex内部的客户有用,但存在风险。没有人会做这个任务。

19.4。 internal_replication =’自动’

19.5。复制的数据库

在队列中,可能是HSE的Valery Baturin。

ClickHouse中的复制在单个表级别进行。这是一个非常灵活的解决方案:在一个服务器上,一个表可能不会被复制,另一个表可能会被复制两次,第三个表可能会在所有服务器上复制。但是,如果数据库中的所有表都以相同的方式复制。这使得很难管理集群。例如,恢复服务器时,需要分别为每个表创建一个副本。

建议实现一个复制元数据的“数据库引擎”(一组现有表和对其上的操作的DDL日志:CREATE,DROP,RENAME,ALTER)。用户将能够创建一个复制的数据库。在其他服务器上创建或还原该表时,将自动创建所有复制的表。

更新。开发任务。

19.6。 +同时选择块以供许多副本合并,拒绝ZK的领导人选举

做完了

19.7。 ZK不可用时能够写入数据,并且在大多数情况下可以拒绝线性块顺序

19.8。拒绝为每个副本分别在ZK中存储很多作品

19.9。拒绝在ZK中存储插入和合并的日志。直接共享块数据

上面讨论了这三个任务,有一些选择。

19.10。云表

需要1.6、19.1、19.6、19.7、19.8、19.9。

20.数据突变

到目前为止,所有点缀的UPDATE / DELETE任务的优先级都不高,但我们预计将在2020年中期接管。

20.1。通过记住多个受影响的块和键来删除支持

20.2。通过将多个键转换为副本,标志列和范围索引上的多个row_number来支持DELETE

20.3。通过记忆表达式并在后台转换为多个键来支持懒惰的DELETE

20.4。 UPDATE支持,转换为DELETE和插入

21.优化性能

21.1。 +并行解析格式

Oleg Ershov开始,Nikita Mikhailov正在完成,Alexander Kuzmenkov正在提供帮助。做完了

21.1.1。如果可以使用整个mmap文件,则在并行解析格式时避免不必要的复制

21.2。平行格式

21.1之后,大概是尼基塔·米哈伊洛夫(Nikita Mikhailov)。这个任务比21.1容易得多。

进行中。

21.3。 +修复了IN部分中设置较大的索引分析的不良性能

每个人都需要(Zen,BC,DataLens,TestEnv …)。安东·波波夫(Anton Popov),第1季/第2季。

更新。安东完成这项任务。大多数已经实施。

21.4。使用ORDER BY键优化GROUP BY和DISTINCT

Dmitry Rubashkin,高等经济学院。安东·波波夫(Anton Popov)正在提供帮助。

如果表具有排序键,则可以有效读取有序数据。如果查询包含一个GROUP BY操作,该操作至少包含表排序键的前缀或其中的插入式函数,则可以使用效率更高的GROUP BY:当从表中读取数据流中遇到下一个键时,聚合的中间结果将最终确定并发送给客户端…

应该为DISTINCT和LIMIT BY做类似的优化。

去年,对ORDER BY业务也做出了类似的决定。

更新。存在对GROUP BY的拉取请求。体面的结果。
更新。完成于GROUP BY,正在进行DISTINCT。
更新。有一个DISTINCT的拉取请求。

21.5。 +必要时对INSERT SELECT上的INSERT进行并行化

Vxider,ICT
有一个拉取请求。

21.6。 +在琐碎的INSERT SELECT情况下减少SELECT的线程数

ucasFL,正在开发中。做完了

21.7。查询结果缓存

阿希姆巴。
有一个拉取请求。但这不是很正确。
更新。在讨论中。

21.8。分配器和缓存的相互集成

经济高等学校Mikhail Kot。这项任务既困难又冒险。

要分配内存,分配器会从操作系统(mmap)请求它。这仅对于足够大的内存块才有可能,并且是相当慢的操作。因此,现代的分配器在程序中缓存了大块内存。通常,在调用free时,不会将内存块分配给OS,而是保留给以后使用。为了分配小块内存,使用特殊的数据结构(自由列表,堆,位图)将大块分解。为了减少多线程程序中的争用,还使这些结构成为线程局部的。

该程序通常具有一些数据缓存。例如-解压缩后的数据缓存,用于保存对相同数据的重复请求。从高速缓存中逐出后,数据块将被释放(释放),并且高速缓存中的数据将无法再使用。但是,如果考虑到内存分配器的工作方式,事实证明,在释放内存之后,程序中仍然可以使用数据。如果分配器没有再次分配这块内存,它可以继续用作缓存。换句话说,该程序具有特定于域的缓存,而分配器具有其自己的缓存,并且它们彼此之间并不了解。

对于特定于域的缓存(例如解压缩缓存),它们将使用尽可能多的可用内存是有好处的。但是在这种情况下,程序中可能没有足够的内存用于其他数据结构。如果内存分配器知道缓存,则可以通过将数据推出缓存来完成内存分配。

更新。有一个无法正常工作的原型,很可能会被推迟。
更新。推迟到秋天。
更新。推迟到。

21.8.1。 ASLR缓存的单独分配器

去年,Danila Kutenin尝试使用Arcadia的lfalloc和Microsoft的mimalloc来解决此问题,但两种解决方案均不适用于生产。成功完成任务21.8将消除对该任务的需要,因此请保留。

更新。我们还尝试了新的tcmalloc,结果不尽人意。到目前为止已取消。

21.9。使用处理器修复下推表达式

尼古拉·科切托夫(Nikolay Kochetov)。需要2.1。

21.10。 +改进了PREWHERE启发式

阿莫斯鸟。

21.11。 +窥孔查询优化

Ruslan Kamalov,Mikhail Malafeev,Victor Grishanin,HSE

基于简化单个小块表达式的方式,在ClickHouse中实现查询优化(所谓的“窥孔”优化)。例子:
-用multiIf替换if链。
-从GROUP BY键的表达式中删除最小/最大/任意聚合。
-从聚合函数中删除算术运算;
-移除任何其他任何功能。
-当GROUP BY通过transform或按行划分时,用Enum替换行。

将if链更改为multiIf,但突然发现这不是优化,反之亦然。
进行了更多的优化。
更新。以上所有优化都可用于拉取请求中。
更新。他们几乎全部被冻结,仅剩一具。
更新。他们冻结了一切。

21.12。 +代数查询优化

Ruslan Kamalov,Mikhail Malafeev,Victor Grishanin,HSE

根据函数的代数属性在ClickHouse中实现查询优化。例子:
-等式比较中的内射函数的求逆。
-向外消除内射函数。
-从ORDER BY中删除单调功能。
-从ORDER BY中删除多余的表达式。
-从GROUP BY中删除其他GROUP BY键中的功能。
-从子查询中删除重复的DISTINCT,ORDER BY。

PR中有一些优化。
更新。除“在等式比较中注入内插函数”之外的所有优化都在PR中。
更新。其中一半以上被冻结,另两处被冻结。
更新。他们冻结了一切。

21.13。聚合功能的融合

之后或与21.11一起。

21.14。优化约束查询

约束允许您指定在将数据插入表中时检查是否为真的表达式。表达式为真的假设也可以用于优化查询。例如,如果您在查询中遇到完全相同的表达式,则可以将其替换为常量1。

如果表达式包含相等,则在查询中遇到相等的一部分时,可以用相等的另一部分替换它,如果这样可以更轻松地读取数据或评估表达式。例如,指定约束:URLDomain =域(URL)。因此,表达式域(URL)可以替换为URLDomain。

更新。它可能会推迟到明年。
推迟到明年。

21.15。多步数据读取而不是PREWHERE¶

需要2.1和21.10。

21.16。通过两次计算来使用大量聚合函数优化GROUP BY

公元前需要。

21.17。在与LIMIT相同的键上存在ORDER BY的情况下优化GROUP BY

公元前需要。

21.18。合并大状态聚合函数的内部并行化

21.19。 +排序优化

瓦西里·莫罗佐夫(Vasily Morozov),阿尔斯·古梅洛夫(Arslan Gumerov),阿尔伯特·基德拉切夫(Albert Kidrachev),HSE。
在过去的一年中,另一个人开始了这项任务,但没有取得足够的进展。
更新。已经提出了最基本的建议方案。

  • 1.最佳排序。

ClickHouse使用非最佳的顶部排序选项。其本质是从每个块中获取前N条记录,然后合并所有块。但是,如果我们知道更少的记录将进入全局前N个记录,则从每个下一个块中获取前N个记录是没有意义的。当然,如果没有行进入累积的顶部,则需要对优先级队列(堆)主题实施变体,以快速跳过整个块。

  • 2.按元组排序的递归变体。

要按元组排序,将使用带有比较器的常规排序,该比较器会在元组元素的循环中对IColumn :: compareAt进行虚拟调用。这不是最佳的-既因为编译时未知元素数量的周期较短,又因为虚拟调用。要进行虚拟调用,可以使用IColumn :: getPermutation方法。在按一列排序的情况下使用。有一个选项,在按元组排序的情况下,也可以应用类似的方法…例如,制作一个updatePermutation方法,该方法接受offset和limit参数,并预置换上一列具有相等值的值范围。

RadixSort用于排序。
我的一个朋友开始尝试使用RadixSort对列进行排序的任务。进行了间接排序的一种变体(用于getPermutation),但没有完全优化-不必要的元素不必要的重排。为了优化它,您将不得不添加一些样板魔术(在最后一步,不要复制某些东西,而不是重新排列索引,而是将它们添加到准备好的位置)。此人还添加了MSD Radix Sort方法来实现基数部分排序。但是甚至没有检查性能。

任务中最有意义的部分可能是使用“基数排序”以未知编译时大小的“数组结构”的形式对位于RAM中的元组进行排序。它可能比第2点中描述的更糟糕。。。尝试也没有什么坏处。

三向比较排序。
虚拟的compareAt方法返回-1、0、1。但是比较排序算法通常依赖于运算符<,并且无法从三向比较中受益。有可能写作,从而有优势吗?

pdq部分排序
好的比较排序算法pdqsort没有部分排序选项。请注意,实际上,ClickHouse查询中的几乎所有排序都是partial_sort,因为ORDER BY几乎总是带有LIMIT。顺便说一句,达妮拉·库特宁(Danila Kutenin)已经尝试过,并证明在琐碎的情况下没有优势。但是,尚不能证明您不能做得更好。

21.20。使用实例化视图优化查询

ByteDance具有现成的实现,但由于代码质量可能较差,他们对此感到担心。
更新。相反,我们将做问题1.16。

21.21。 +使用mmap读取大文件

做了一个变体,但是很笨拙。如果没有在生产中进行测试,则默认情况下无法启用它。

21.22。用户空间页面缓存

需要21.8。
推迟了

21.23。 +通过二级索引加速工作

zhang2014。
有一个拉取请求。
做完了

22.债务和未完成的机会

22.1 +修复使用TLS的超时中断

Yandex.Cloud需要。由Alexey Milovidov制造。

22.2。 +在只读情况下,删除更改本地协议设置的功能

N. Vartolomei。

22.3。 +防范荒谬的用户定义编解码器

22.4。 +校正表RWLock-ah中的其余死锁

亚历山大·卡扎科夫(Alexander Kazakov)。 Yandex.Metrica和Datalens需要。这项任务正在逐渐拖延,附近地方的改正也变得不那么重要了。
在Q1中将以1.2为准进行或取消。和1.3。
更新。添加了超时。

22.5。 +校正CI中压力测试中罕见的TSan触发器

亚历山大·卡扎科夫(Alexander Kazakov)完成了这项任务。

22.6。 +仅更改ALTER TABLE中的DEFAULT可以更改列类型

亚历山大·萨平(Alexander Sapin)完成了这项任务。

22.7。 +如果IN查询中有子查询,则行级安全性不起作用

需要度量。伊万·勒赞金(Ivan Lezhankin)。

22.8。 +修复参数化查询的参数反序列化

Vasily Nemkov,Altinity想修复它,但困难很小,可能Alexey Milovidov会重制。

22.9。在Protobuf 3的情况下,以Protobuf格式了解具有默认值的数组的反序列化

维塔利·巴拉诺夫(Vitaly Baranov)。 也许这是一个基本问题,应仅记录在案。
我们似乎正在取消,但还不是一切都清楚。

22.10。 +修复了按请求跟踪内存消耗时的漂移

需要6.3。,但可以通过单独的技巧进行改进。 Metrika和BC需要。

22.11。 +更简单的服务/查询设置

并跳过未知设置。对于Metrica简化升级而不更改配置很重要。
Vitaly Baranov,完成了。

22.12。 +修复来自Kafka的不良读取性能

ClickHouse具有如此低性能的代码并不常见。开发实践并不意味着此类代码未经适当的性能测试就可以投入生产。

它最初分配给伊万·莱詹金(Ivan Lezhankin),但由于某些未知原因,几个月没有完成。
由Altinity的Mikhail Filimonov制造。

22.13。 +了解为什么某些排序规则不起作用

最初,它被分配给伊万·莱詹金(Ivan Lezhankin),但亚历山大·沙平(Alexander Sapin)做到了。

22.14。 +了解为什么在某些情况下StorageSet无法用于MergeTree表

Nikita Mikhailov似乎做到了-检查有关此主题的现有问题。

22.15。 Kafka提交规范化和操作等幂

高度
我不知道状态是什么。

22.16。 +修复了DoubleDelta编解码器性能低下的问题

Vasily Nemkov,Altinity-正在进行中。
更新。做完了

22.17。始终为MaterializedView工作

22.18。修复了添加类型域后格式性能明显下降的问题

瓦西里·涅姆科夫(Vasily Nemkov),《极度》

22.19。 +同时使用SAMPLE和PREWHERE

需要度量。尼古拉·科切托夫(Nikolay Kochetov),2019年11月。

22.20。 +在某些情况下PREWHERE的错误操作

尼古拉·科切托夫(Nikolay Kochetov),2019年12月。

22.21。 + Unix纪元开始前后的错误DateTime行为

阿列克谢·米洛维多夫(Alexey Milovidov)。

22.22。在转换函数和CASE中对多个值可为null

在10.14之后。

#7237
#2655

22.23。正确处理在默认值上引发异常的函数中的Nullable:modulo,intDiv

22.24。 +过多过滤ODBC连接字符串

需要度量。阿列克谢·米洛维多夫(Alexey Milovidov)。

22.25。摆脱btrie库

阿列克谢·米洛维多夫(Alexey Milovidov)。低优先级。

22.26。分位数差

#2668

阿列克谢·米洛维多夫或将连任。

22.27。查看zhang2014和sundy-li关闭的一些PR

阿列克谢·米洛维多夫(Alexey Milovidov)。

22.28。调查并修复Kafka重新平衡行为

高度

22.29。 +可执行字典的DDL漏洞

亚历山大·萨平

23.默认节日

23.1。 +在ZooKeeper中启用minimalistic_part_header

大大减少了ZooKeeper中的数据量。在Yandex.Metrica投入生产已有一年的时间。
阿列克谢·米洛维多夫(Alexey Milovidov),2019年11月。

23.2。启用distributed_aggregation_memory_efficiency

尽管轻量级查询的性能始终会提高,但存在轻量级查询的性能降低的风险。

23.3。启用min_bytes_to_external_sort和min_bytes_to_external_group_by

理想的5.2。和13.1。

23.4。默认情况下在分布式表中启用同步写入

有一个假设,即它不能在非常大的群集上很好地工作。

23.5。启用compile_expressions

需要7.2。该任务最初由Denis Skorobogatov,HSE和Yandex完成了99%。其余百分比由Alexey Milovidov,然后是Alexander Sapin完成。

23.6。 +在CSV中启用列顺序会计

轻轻地打开它。

23.7。在CSV中包括NULL作为默认值

轻轻地打开它。

23.8。 +启用VALUES优化

轻轻地打开它。

23.9。 +启用处理器

Q1。尼古拉·科切托夫(Nikolay Kochetov)。

23.10。 +启用mlock二进制

Oleg Alekseenkov#3553具有锁定二进制文件的功能。
…当ClickHouse上的服务器上运行着许多第三方程序时,它会有所帮助(有时我们戏称它们为“垃圾程序”)。

24.实验问题

24.1。 Web界面,用于查看集群状态和性能分析请求

Anton Mamonov,UrFU,Yandex。

ClickHouse具有丰富的自省和性能分析功能。这些功能可通过系统表使用,您必须通过制定SQL查询来使用它们。不舒服

相反,建议使ClickHouse呈现HTML页面,该页面实现具有以下功能的交互式Web界面:
-显示群集的状态(已知哪些群集,每个服务器的状态);
-当前服务器或集群中所选服务器的负载图;
-更新的请求清单;
-通过一个按钮查看最受欢迎的过滤查询日志;
-查看群集上的日志,例如-最近的错误;
-查看选定请求的资源使用指标,火焰图和pprof图;
-报告群集使用情况(例如:今天用户的CPU核心数)。

24.2。实验压缩算法

推迟了

ClickHouse支持LZ4和ZSTD进行数据压缩。就众所周知的速度和压缩比之比而言,这些算法是帕累托最优的。但是,鲜为人知的压缩算法可以以某种方式胜过它们。压缩率可比的潜在更快的产品:蜥蜴,LZSSE,密度。较强的:bsc和csc。有必要研究这些算法,将其支持添加到ClickHouse,并研究它们在测试数据集上的工作。

24.3。 -实验编解码器

有用于编码数字序列的专用算法:组VarInt,MaskedVByte,PFOR。这些算法的最有效实现需要研究。您可以在https://github.com/lemire和https://github.com/powturbo/以及https://github.com/schizofreny/middle-out中找到示例

在ClickHouse中以编解码器的形式实现它们,并研究它们在测试数据集上的工作。

更新。在早期阶段,有两个请求被搁置。
更新。取消。

24.4。 VFS级别的ClickHouse中的加密

ClickHouse中的数据存储时未加密。通过访问磁盘,攻击者可以读取数据。建议实现两种加密方法:

VFS级别的加密。
讨论实现细节。第三季度/第四季度。
维塔利·巴拉诺夫(Vitaly Baranov)。
备份后推迟。

24.5。对单个值的加密支持

另见24.5。

单个值的加密。
这需要实现SQL可用的加密和解密功能。对于加密,实现添加所需数量的随机位的能力,以在同一数据上排除相同的加密值。这将允许在不删除表行的情况下实现“忘记”数据的可能性:您可以使用不同的密钥对不同客户端的数据进行加密,而要忘记一个客户端的数据,只需删除密钥即可。
瓦西里·内姆科夫(Alvinity)
审核过程中存在拉动请求,我们修复了性能问题。

24.6。用户空间RAID

Gleb Novikov,高等经济学院。

RAID使您可以同时提高磁盘上数据存储的可靠性并提高磁盘阵列的速度。通常,RAID是使用内置Linux内核功能(mdraid)或使用硬件控制器配置的。这具有以下限制:

有时(在某些公司的云基础架构中),服务器配备有作为独立分区(JBOD)安装的独立磁盘,而无法创建RAID。

ClickHouse通常使用服务器到服务器复制来提供冗余。但是在恢复其中一个RAID磁盘时,不会使用来自副本的数据,并且如果RAID-0中的一个磁盘发生故障,则必须传输副本中的所有数据,而不仅仅是传输与其中一个磁盘相对应的数据。发生这种情况是因为RAID没有集成到ClickHouse中,并且不“了解”其功能。

没有像LRC这样的高级冗余选项。

为了克服这些限制,建议在ClickHouse中实现一种内置算法,用于在磁盘上排列数据。

在初始阶段有一个拉取请求。
推迟了

24.7。子查询过滤的概率数据结构

Ruzel Ibragimov,HSE和Yandex。

一个常见的任务是对子查询获得的集合执行过滤查询。示例:查找今天访问过该站点且一周前访问过的用户。这表示为查询:从表WHERE EventDate =今天()和用户ID输入(SELECT …)中选择用户ID。执行此查询时,首先执行IN右侧的子查询,并在RAM中形成一个哈希表。然后使用此哈希表进行过滤。

有时,数据量非常大,并且哈希表无法放入RAM。在这种情况下,您可以考虑采用近似计算作为一种选择:查找今天访问过该网站且可能一周前访问过该网站的用户。为此,可以使用Bloom Filter代替哈希表。另一个任务:找到最有可能至少相遇了几次的用户。您可以为此使用计数布隆过滤器。您还应该研究商过滤器和杜鹃文件管理器数据结构,以及安德烈·普拉霍夫(Andrey Plakhov)的秘密混沌映射算法。

建议使用特殊语法在ClickHouse查询语言中实现此目的,例如x IN BLOOM FILTER(n,m)(SELECT …)。

在工作原型阶段有一个拉取请求。

24.8。 +针对AVX / AVX2 / AVX512和ARM NEON的矢量化代码的专业化

#1017

Dmitry Kovalkov,HSE和Yandex。

绝大多数ClickHouse代码是为x86_64编写的,带有一组包括SSE 4.2的指令。只有少数稀有功能通过动态调度支持AVX / AVX2 / AVX512。

在任务的第一部分中,您应将一些原语的实现添加到ClickHouse中,并针对新的指令集进行优化。例如pcg随机数生成器的AVX2实现:https://github.com/lemire/simdpcg

在问题的第二部分中,提出了使用AVX / AVX2上的SSE内在函数修改现有代码段并比较性能的方法。还讨论了ARM NEON的优化。

24.9。 +函数工厂中CPU调度的一般方法

Dmitry Kovalkov,HSE和Yandex。

续24.8。

更新。有一个拉取请求。在审查阶段。做完了

24.10。支持Half / bfloat16 / unum类型

#7657

HSE的Rustam Huseyn-zade。

在中间阶段有一个拉取请求。
推迟了

24.11。用户定义功能

伊戈尔·米涅耶夫(Igor Mineev),高等经济学院。

ClickHouse提供了一组相当丰富的查询语言内置函数,但是不允许用户在不编辑源代码和重新编译系统的情况下添加自己的函数。这是由以下潜在问题引起的:

ClickHouse是一个面向数组的系统,代码中的所有函数都接受整个数组进行处理,而不是单个值。这使内部界面变得复杂,并降低了用户友好性。
要提供以共享库形式连接UDF的功能,需要修复此接口或保持向后兼容性,而我们希望在开发ClickHouse时自行决定更改此接口,而无需回头。
内部数据结构的复杂性增加了缓冲区溢出错误和内存损坏的可能性,这使得使用自定义功能维护ClickHouse非常困难。
但是,您可以采用更整洁的方法,避免直接与共享库链接。

首先,您可以将UDF支持实现为由简单的ClickHouse函数组成的表达式。 ClickHouse具有内置的LLVM代码生成,这将使此类功能非常有效地工作。但是,这种方法非常有限,因此并不详尽。

然后提出以C ++源代码的形式实现UDF支持,这些源代码在运行时使用ClickHouse标头文件进行编译。从源而不是共享库要求编译将减轻对ABI兼容性支持的需求。

为了安全起见,有必要调查在共享内存中放置数据缓冲区的可能性,以便在独立的内存隔离进程中执行UDF。也许与Apache Arrow集成可以派上用场。

它还讨论了用Rust编写UDF以及使用Web Assembly的可能性。我们可以分别考虑NumPy和R以及其他在整个阵列上提供操作的技术的连接。

更新。 UDF实现有两种变体。

24.12。 -GPU卸载

这样做的风险是,即使是众所周知的GPU基础(例如OmniSci)也要比ClickHouse慢。
优点仅在完全排序和JOIN上才有可能。
nVidia的Alexey Solovey和HSE的Rita Konnova。

NVidia制作了一个原型,以利用ClickHouse中的一些汇总函数来卸载GROUP BY计算,并承诺公开提供源代码以供进一步开发。建议研究此原型并将其适用性扩展到更广泛的用例。另外,建议研究OmniSci或Alenka系统的源代码或CUB库https://nvlabs.github.io/cub/并在ClickHouse中应用某些算法。

更新。 Nvidia发布了一个原型,现在需要将其集成到构建系统中。
更新。集成到构建系统中-Ivan Lezhankin(未完成)。
更新。有一个双音排序样机。
更新。双向分类原型虽然乏味,但其可行性尚有疑问(工作速度较慢)。
可能将需要保留和移除。
已删除。

24.13。流请求

ClickHouse作为CEP系统的前提条件。

24.14。视窗功能

#1469

需要2.1。

更新。有两个来自外部贡献者的原型。

24.15。半结构化数据支持

需要1.14和2.10。

24.16。改善合并启发式

去年,HSE和Yandex.Taxi的Egor Solovyov对这个问题进行了研究。他的研究表明,无法通过更改参数来显着改进该算法。但是这项研究是la脚的,因为只考虑了已经使用的算法。即,任务保持打开状态。

推迟了

24.17。加快并行GROUP BY的实验方法

马克西姆·谢列布里亚科夫

工作任务。
更新。取得了令人鼓舞的结果。
更新。有一个拉取请求-在大多数情况下,这既加快了速度,又减少了内存消耗,但是需要改进。

24.18。用于复制的非TCP文件传输协议

24.19。 GROUP BY中间状态作为键值访问的数据结构

推迟了

24.20。某些表达式的短路评估

两年前,Anastasia Tsarkova,HSE和Yandex尝试完成该任务,但实施起来非常不便,因此被删除了。
在讨论中。

24.21。在ClickHouse中实现分布式共识协议

只有在19.2。之后才有意义。

24.22。在数据块上进行类型推断。通过示例输出数据格式

任务已被推迟。

ClickHouse是一个强类型的系统。为了读取任何格式的数据(例如CSV),您需要预先指定数据类型。如果在读取格式时发现无法在指定的类型内读取数据,则将引发异常。

ClickHouse还可以用于快速分析本地文件,而无需将其加载到数据库中(clickhouse本地程序)。在这种情况下,它的使用可以代替awk,sed,grep。但是不便之处仍然是-需要指定数据类型。

建议通过使用启发式和类型的逐步扩展来在第一个数据块上实现类型推断的功能。

另一个实验性问题是实现启发式方法来处理未知的逐行文本格式的数据。检测CSV,TSV,JSON,定界符和值格式。

24.23。 -对许多插入/读取的最小事务支持

经济学院马克西姆·库兹涅佐夫(Maxim Kuznetsov)。
取消。

MergeTree类型的表由一组独立的,不可变的“块”数据组成。插入数据(INSERT)时,会形成新的块。修改数据(合并块)时,将形成新的块,而旧的块将变为非活动状态,并且不再被下一个请求使用。在某个时间点从许多块的快照执行读取数据(SELECT)。这样,读取和插入不会互相阻塞。

如果执行了几个SELECT查询,则可以从快照的几个不同时间点开始进行数据读取,并且可能不一致。示例:向用户显示来自多个图形和表格的报告,但是由于不同查询之间的数据有时间要更新,因此显示的数据彼此不对应。

另一方面,一个示例-用户想要对一个或多个表执行多个INSERT,但是从其他查询(SELECT)的角度来看,数据将以原子方式出现在其中。

为了解决这些问题,建议为数据片段引入全局时间戳(现在已经有增量的片段,但是它们分配在同一张表中)。第一步是在服务器中创建这些时间戳。第二步是为所有服务器添加时间戳,但是基于本地时钟不准确。第三步是制作由协调服务发布的时间戳记。

24.24。 -实施差分隐私算法

#6874

高等经济学院Artyom Vishnyakov。有一个拉取请求。
已取消,因为该解决方案的可用性较低。

24.25。将HTTP用户代理处理功能集成到ClickHouse中

#157
Yandex.Metrica中有一个不错的代码。从管理层获得同意。
Mikhail Filitov,高等经济学院。
更新。有一个拉取请求。我们仍然需要清理库代码。

24.26。支持开放式跟踪或类似物

#5182

HSE和Yandex.YT的Alexander Kozhikhov。
更新。有一个带有原型的请求请求。
更新。亚历山大·库兹曼科夫(Alexander Kuzmenkov)接下了工作。

24.27。 min-hash,sim-hash算法用于半复制的模糊搜索的实现

#7649

ucasFL,ICT。

min-hash和sim-hash算法使您可以为文本计算多个哈希值,以使在文本中进行很小的更改就不会改变至少一个哈希。可以使用n-gram和字典瓦片来实现计算。建议在ClickHouse中以函数形式添加对这些算法的支持,并研究它们在半重复模糊搜索问题中的适用性。

有一个拉取请求,还有一些要完成的事情。
更新。 Nikolay Kochetov接下了工作。

24.28。分位数的另一幅草图

与QuantileTiming类似,但具有日志存储桶。请参阅DDSketch。
推迟了

24.29。箭飞行支持

#7554

Zhanna Zosimova,高等经济学院。
更新。到目前为止,Arrow已被支持为I / O格式。

24.30。 -ClickHouse作为图形DBMS

阿莫斯·伯德(Amos Bird),但他的解决方案太麻烦了,还没有开源。取消。

24.31。相关子查询

用JOIN重写。不早于21.11、21.12、21.9。低优先级。
推迟了

24.32。 GRPC支持

Maria Konkova,HSE和Yandex。
另请参阅24.29。

ClickHouse具有两个主要协议:服务器之间进行通信的本机协议和HTTP / 1.1协议。 HTTP / 1.1协议可方便地使用多种编程语言进行工作,但是与本机协议不同,它不支持请求期间的双向信息交换:
-在请求执行期间传输有关进度的信息;
-在请求执行期间传输日志;
-在尚未开始传输数据时取消请求的执行;

正在考虑一个选项-ClickHouse中的GRPC支持。这里有一些非显而易见的要点,例如-以面向列的格式有效地传输数据数组-将其包装在GRPC中将有多方便。

任务正在执行,有一个请求请求。 #10136
更新。该任务由Vitaly Baranov接管。

25. DevRel

25.1。 +针对新手开发人员的说明翻译

亚历山大·卡扎科夫(Alexander Kazakov),2019年11月。

25.2。 +有关英语数据混淆的文章的校对和排版

艾米(Amy),亚历山大·卡扎科夫(Alexander Kazakov),阿列克谢·米洛维多夫(Alexey Milovidov),第一季度。
准备布置。

25.3。准备文章“ ClickHouse性能优化的秘密”

阿列克谢·米洛维多夫(Leonid)。

25.4。准备文章“ Query Profiler:困难的方式”

阿列克谢·米洛维多夫(Leonid)。

25.5。准备文章“我们值得拥有的ClickHouse测试”

25.6。这些文章翻译成英文

需要25.3、25.4、25.5。艾米

25.7。 Danila Kutenin的文章翻译成英文

艾米

25.8。 +在BDTC上的主题演讲

阿列克谢·米洛维多夫(Alexey Milovidov)

25.9。主讲人:khvostikao,ilezhankin,nikitamikhailov,akuzm等

Olga Khvostikova,Ivan Lezhankin,Nikita Mikhailov,Alexander Kuzmenkov,Artyom Zuikov。
演讲嘉宾:Alexey Milovidov,Nikolay Kochetov,Alexander Sapin。
到2020年,至少有8位演讲者。

25.10。俄罗斯和白俄罗斯的聚会:针对开发人员或黑客马拉松的莫斯科x2 +聚会,圣彼得堡,明斯克,下诺夫哥罗德,叶卡捷琳堡,新西伯利亚和/或Akademgorodok,Innopolis或喀山

叶卡捷琳娜是一个组织。更新。在线会议有两个俄语会议,两个英语会议。

25.11。 +外国聚会:美国东部(纽约,可能是罗利),可能是西北(西雅图),中国(又是北京,可能是开发者聚会或黑客马拉松),伦敦

伊万·布林科夫(Ivan Blinkov)是一个组织。美国计划有两个。更新。在美国举行了两次聚会,在欧洲举行了一次聚会。更新。所有其他人都已在线上移动。

25.12。文章“科学”-关于用于数据和索引或架构的白皮书的存储设备。可以申请VLDB

低优先级。阿列克谢·米洛维多夫(Alexey Milovidov)。

25.13。 +参与与后端开发,C ++开发或数据库有关的所有Yandex活动,可以参与DevRel活动

阿列克谢·米洛维多夫(Alexey Milovidov)和所有准备发言的人。
更新。我们参加。

25.14。俄罗斯的会议:所有HighLoad,可能是CodeFest,DUMP或UWDC,可能是C ++俄罗斯

阿列克谢·米洛维多夫(Alexey Milovidov)和所有准备发言的人。
更新。在线有Saint HighLoad。
更新。有C ++俄罗斯。
CodeFest,DUMP,UWDC已取消。
更新。添加了高负荷的Fwday,Matemarketing。

25.15。国外会议:Percona,DataOps,试图扩大规模

阿列克谢·米洛维多夫(Alexey Milovidov)和所有准备发言的人
更新。有Percona。
DataOps已被取消。

25.16。网站play.clickhouse

目标是实现一个站点,您可以在其中尝试对临时ClickHouse实例设置任意请求并研究其行为。类似的项目包括:Compiler Explorer,http://ideone.com/、SQLFiddle、DB-Fiddle。

使用这样的网站,您可以解决以下任务:
-熟悉ClickHouse查询语言;
-说明文件中的例子;
-证明测试数据集的工作速度;
-比较不同版本的ClickHouse的行为;
-意外行为或错误的证明;

需要解决实例的安全性和隔离性问题(在具有网络限制的容器中进行提升),使用写时复制文件系统连接测试数据集;有限的资源。

有一个最小的原型。由Ilya Yatsishin制造。此原型不允许共享链接到查询结果。
更新。在最后阶段,这是用于测试不同版本的ClickHouse的工具。

25.17。与大学合作:HSE,UrFU,ICT北京

Alexey Milovidov和整个开发团队。
感谢Robert Hodges,添加了CMU。
更新。与HSE 2019/2020的交互已成功完成。
更新。 2020/2021年的准备工作正在进行中。

25.18。 -在ShAD的演讲

阿列克谢·米洛维多夫(Alexey Milovidov)。

25.19。 -参加SHAD的C ++开发课程

25.20。分析型DBMS性能的另一个比较

MatFU Bubnov,UrFU

就某些类查询的处理速度而言,鲜为人知的专业DBMS可以与ClickHouse竞争。示例:TDEngine和DolphinDB,VictoriaMetrics,以及Apache Doris和LocustDB。建议研究和分类这些系统的体系结构特征-它们的特征和优点。安装这些系统,加载测试数据,检查性能。分析如何实现收益。

更新。 TDEngine有一些倾向。
更新。添加了OmniSci,更新了MonetDB。
还研究了QuestDB和VectorSQL(它们不起作用)。

25.21。在中国再获奖的贡献者

更新。我们正在等待取消限制并恢复在线聚会的活动。

25.22。 ClickHouse的现场帮助,可在活动临近的日子为公司提供帮助

伊万·布林科夫(Ivan Blinkov)是一个组织。为一家土耳其公司举办了一次活动。
更新。现场由在线代替。
更新。为几家秘密公司举行了磋商。

25.23。 ClickHouse的新商品

更新。旧的还是足够的,分布已经减少。

25.24。 Bughunter或C ++代码优化

没有达成协议,应为Yandex员工开始比赛。

25.25。潜在客户研讨会Yandex.Clouds

如所须。 Alexey Milovidov,组织-Yandex.Cloud。

25.26。 -参与GSoC

安德烈·鲍罗丁(Andrey Borodin)试图说服我们参加,但到目前为止,他面临的问题是25.17。

UPD:不参加。

25.27。 +刷新ClickHouse网站

伊万·布林科夫(Ivan Blinkov)。没有风险。 Yandex.Cloud需要。更新。做完了

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注