ClickHouse单机性能很强,基于列式存储,能利用向量化引擎做到并行化计算,查询基本上是毫秒级或秒级的反馈,但ClickHouse没有完整的事务支持,对分布式表的join能力较弱。
Doris运维简单,扩缩容容易且支持事务,但Doris版本更新迭代较快且成熟度不够,也没有像ClickHouse自带的一些函数如漏斗、留存,不足以支撑转转的业务场景。
基于以上考量,最终选择了ClickHouse作为分析引擎。
ClickHouse
ClickHouse是面向实时联机分析处理的基于列式存储的开源分析引擎,是俄罗斯于2016年开源的,底层开发语言为C++,可以支撑PB数据量级的分析。ClickHouse有以下特性:
具有完备的dbms功能,SQL支持较为完善。
基于列式存储和数据压缩,支持索引。
向量化引擎与SIMD提高CPU的利用率,多核多节点并行执行,可基于较大的数据集计算,提供亚秒级的查询响应。
支持数据复制和数据完整性。
多样化的表引擎。ClickHouse支持Kafka、HDFS等外部数据查询引擎,以及MergeTree系列的引擎、Distribute分布式表引擎。
ClickHouse的查询场景主要分为四大类:
交互式报表查询:可基于ClickHouse构建用户行为特征宽表,对于多维度,多指标的计算能秒级给出计算反馈。
用户画像系统:在ClickHouse里面构建用户特征宽表,支持用户细查、人群圈选等。
AB测试:利用ClickHouse的高效存储和它提供的一些自带的函数,如grouparray函数,可以做到秒级给出AB实验的效果数据。
监控系统:通过Flink实时采集业务指标、系统指标数据,写到ClickHouse,可以结合Grafana做指标显示。
ClickHouse的优化实践
在数据分析过程中常见的问题大都是和内存相关的。如上图所示,当内存使用量大于了单台服务器的内存上限,就会抛出该异常。
针对这个问题,需要对SQL语句和SQL查询的场景进行分析:
如果是在进行count和disticnt计算时内存不足,可以使用一些预估函数减少内存的使用量来提升查询速度;
如果SQL语句进行了group by或者是order by操作,可以配置max_bytes_before_external_group_by和max_bytes_before_external_sort这两个参数调整。
性能调优参数
max_concurrent_queries:限制每秒的并发请求数,默认值100,转转调整参数值为150。需根据集群性能以及节点的数量来调整此参数值。
max_memory_usage:设置单个查询单台机器的最大内存使用量,建议设置值为总内存的80%,因为需要预留一些内存给系统os使用。
max_memory_usage_for_all_queries:设置单服务器上查询的最大内存量,建议设置为总内存的80%~90%。
max_memory_usage_for_user & max_bytes_before_external_sort:group by和order by使用超出内存的阈值后,预写磁盘进行group by或order by操作。
background_pool_size:后台线程池的大小,默认值为16,转转调整为32。这个线程池大小包含了后台merge的线程数,增大这个参数值是有利于提升merge速度的。