ClickHouse简介
ClickHouse是什么
ClickHouse是俄罗斯Yandex开发的一款基于列式存储的开源OLAP查询数据库,基于C++语言开发的。ClickHouse在 2016 年开源,在计算引擎里算是一个后起之秀,在内存数据库领域号称是最快的。
另外需要注意的是,ClickHouse并不是基于Hadoop生态的,而是采用 Local attached storage 作为存储,这样整个 IO 可能就没有 Hadoop 那一套的局限。
ClickHouse的特点
- 列式存储
ClickHouse底层数据存储是列式存储的,即同一列的数据放到一块存储,区别于常见的行式存储,列式存储有以下特点
※ 由于一列的数据都是同一数据类型的,因此数据格式更加相近,因此应用数据压缩算法的效果会更好
※ 对某列数据进行聚合计算更加方便
※ 数据写入速度较慢(每条数据都要单独寻找写入位置),因此ClickHouse更推荐批量的写入,避免多次小批量的写入数据 - 表引擎
ClickHouse 和 MySQL 类似, 把表级的存储引擎插件化, 根据表的不同需求可以设定不同的存储引擎。目前包括合并树、日志、接口和其他四大类 20 多种引擎。ClickHouse的表引擎是很重要的一项机制,会影响到数据的存储方式和位置,进而对查询性能和效率有影响 - 高吞吐
ClickHouse 采用类 LSM Tree 的结构,数据写入后定期在后台 Compaction。通过类 LSM tree的结构, ClickHouse 在数据导入时全部是顺序 append 写,写入后数据段不可更改,在后台compaction 时也是多个段 merge sort 后顺序写回磁盘。顺序写的特性,充分利用了磁盘的吞吐能力,即便在 HDD 上也有着优异的写入性能。 - 线程级并行
ClickHouse将数据划分为多个分区(partition,类似于Hive的分区),每个分区再进一步划分为多个索引段(index ganularity)。把分区里面的数据划分成细粒度的好处是可以多核并行处理。
执行一条查询SQL时可以利用多线程,把SQL提交到每个分区查询,每个CPU现成管理一个分区的数据查询,最后合并结果。这种极致的并行处理能力极大的降低了查询的延迟。但是因为查询是多线程的,所以非常消耗CPU,每条SQL都是并行的,这样的话带来的问题就是并行查询很多SQL的时候就会并发非常高,核数不够的话CPU就会不停的在线程之间来回切换。CPU在大量线程里面轮转本事就要消耗CPU,所以开销更大。
ClickHouse对一条SQL就已经是高并发,并行处理了,如果提交的SQL还是高并发就不适合使用ClickHouse。ClickHouse适合查询数据量比较大,SQL比较复杂的查询,他的单一SQL处理能力非常强,因为是并行的,如即席查询,或者像大屏这种低频的查询。
ClickHouse的适用场景
由于列式存储的特点,ClickHouse更适合用于OLAP数据查询,数据定期批量插入,多次查询。
同时由于ClickHouse的关联性能不够优秀,因此更适合存储数据关联后得出的结果,用作数仓的DWS/ADS层,支撑即席查询或大屏的数据服务。
官方文档