1、为什么选择clickhouse?
足够快,在选择clickhouse以前我们也有调研过presto、druid等方案,presto的速度不够快,无法在5分钟内完成这么多次的查询。
druid的预计算挺好的,但是维度固定,我们的指标的维度下钻都是很灵活的,并且druid的角色太多维护成本也太高,所以也被pass了。
最终我们选择了clickhouse,在我们使用之前,部门内部其实已经有使用单机版对离线数据的查询进行加速了,所以选择clickhouse也算是顺理成章。
2、clickhouse和presto查询速度比较
clickhouse集群现状:32核128G内存机器60台,使用ReplicatedMergeTree引擎,每个shard有两个replica。
presto集群的现状:32核128G内存机器100台。
1)最简单的count()的case
从上图可以看到clickhouse在count一个1100亿数据表只需要2s不到的时间, 由于数据冗余存储的关系,clickhouse实际响应该次查询的机器数只有30台(60 / 2),presto在count一个400亿的数据表耗时80秒左右的时候,100台机器同时在处理这个count的查询。
2)常规指标维度下钻计算count() + group by + order by + limit
同样在1100亿数据表中clickhouse在该case上面的执行时间也是非常不错的耗时5s左右,presto在400亿的数据集上完成该查询需要100s左右的时间。
从上面两个常规的case的执行时间我们可以看出,clickhouse的查询速度比presto的查询速度还是要快非常多的。
3、clickhouse为什么如此快
1)优秀的代码,对性能的极致追求
clickhouse是CPP编写的,代码中大量使用了CPP最新的特性来对查询进行加速。
2)优秀的执行引擎以及存储引擎
clickhouse是基于列式存储的,使用了向量化的执行引擎,利用SIMD指令进行处理加速,同时使用LLVM加快函数编译执行,当然了Presto也大量的使用了这样的特性。
3)稀疏索引
相比于传统基于HDFS的OLAP引擎,clickhouse不仅有基于分区的过滤,还有基于列级别的稀疏索引,这样在进行条件查询的时候可以过滤到很多不需要扫描的块,这样对提升查询速度是很有帮助的。
4)存储执行耦合
存储和执行分离是一个趋势,但是存储和执行耦合也是有优势的,避免了网络的开销,CPU的极致压榨加上SSD的加持,每秒的数据传输对于网络带宽的压力是非常大的,耦合部署可以避免该问题。