文章目录

1.ClickHouse是什么

ClickHouse是俄罗斯Yandex开发的一款基于列式存储的开源​​OLAP​​​查询数据库,基于​​C++​​​语言开发的。ClickHouse在 2016 年开源,在计算引擎里算是一个后起之秀,在内存数据库领域号称是最快的。
另外需要注意的是,ClickHouse并不是基于Hadoop生态的,而是采用 Local attached storage 作为存储,这样整个 IO 可能就没有 Hadoop 那一套的局限。

ClickHouse-1_概述_sql

2.ClickHouse的特点

  1. 列式存储
    ClickHouse底层数据存储是列式存储的,即同一列的数据放到一块存储,区别于常见的行式存储,列式存储有以下特点
    ※ 由于一列的数据都是同一数据类型的,因此数据格式更加相近,因此应用数据压缩算法的效果会更好
    ※ 对某列数据进行聚合计算更加方便
    ※ 数据写入速度较慢(每条数据都要单独寻找写入位置),因此ClickHouse更推荐批量的写入,避免多次小批量的写入数据
    ClickHouse-1_概述_大数据_02
    ClickHouse-1_概述_数据_03
  2. 表引擎
    ClickHouse 和 MySQL 类似, 把表级的存储引擎插件化, 根据表的不同需求可以设定不同的存储引擎。目前包括合并树、日志、接口和其他四大类·​​20​​多种引擎。ClickHouse的表引擎是很重要的一项机制,会影响到数据的存储方式和位置,进而对查询性能和效率有影响
  3. 高吞吐
    ClickHouse 采用类 LSM Tree 的结构,数据写入后定期在后台 Compaction。通过类 LSM tree的结构, ClickHouse 在数据导入时全部是顺序 append 写,写入后数据段不可更改,在后台compaction 时也是多个段 merge sort 后顺序写回磁盘。顺序写的特性,充分利用了磁盘的吞吐能力,即便在 HDD 上也有着优异的写入性能。
  4. 线程级并行
      ClickHouse将数据划分为多个分区(partition,类似于Hive的分区),每个分区再进一步划分为多个索引段(index ganularity)。把分区里面的数据划分成细粒度的好处是可以多核并行处理。
      执行一条查询SQL时可以利用多线程,把SQL提交到每个分区查询,每个CPU现成管理一个分区的数据查询,最后合并结果。这种极致的并行处理能力极大的降低了查询的延迟。但是因为查询是多线程的,所以非常消耗CPU,每条SQL都是并行的,这样的话带来的问题就是并行查询很多SQL的时候就会并发非常高,核数不够的话CPU就会不停的在线程之间来回切换。CPU在大量线程里面轮转本事就要消耗CPU,所以开销更大。
      ClickHouse对一条SQL就已经是高并发,并行处理了,如果提交的SQL还是高并发就不适合使用ClickHouse。ClickHouse适合查询数据量比较大,SQL比较复杂的查询,他的单一SQL处理能力非常强,因为是并行的,如即席查询,或者像大屏这种低频的查询。
  5. DBMS 的功能
    几乎覆盖了标准 SQL 的大部分语法,包括 DDL 和 DML,以及配套的各种函数,用户管理及权限管理,数据的备份与恢复。
  6. 性能对比
    单表:
    ClickHouse-1_概述_大数据_04
    关联查询:
    ClickHouse-1_概述_sql_05
    ClickHouse 像很多 OLAP 数据库一样,单表查询速度由于关联查询,而且 ClickHouse的两者差距更为明显。

3.ClickHouse的适用场景

由于ClickHouse 是列式存储的原因, 所以ClickHouse 适合OLAP 查询, 数据定期批量插入, 查询。

同时由于ClickHouse的关联性能不够优秀,因此更适合存储数据关联后得出的结果,用作数仓的DWS/ADS层,支撑即席查询或大屏的数据服务。
ClickHouse-1_概述_数据_06

第一,用户行为分析。ClickHouse将用户行为分析表制作成一张大的宽表,减少join的形式,实现路径分析、漏斗分析、路径转化等功能。除此之外,它还能支撑广告,营销和AB实验。

第二,实时BI报表。ClickHouse可以根据业务需求,实时制作及时产出,查询灵活的BI报表,包括订单分析,营销效果分析,大促活动分析等等。

第三,监控。ClickHouse可以将系统和应用监控指标通过流式计算引擎Flink,Spark streaming清洗处理以后,实时写入ClickHouse。结合Grafna进行可视化展示。

第四,用户画像。ClickHouse可以对各种用户特征进行数据加工,制作成包含全部用户的一张或多张用户特征表,提供灵活的用户画像分析,支撑广告,圈人等业务需求等等。

4.ClickHouse为何那么快

ClickHouse-1_概述_java_07
那么ClickHouse的查询速度为什么会这么快呢?它类似于LSM tree,所有数据都是经过有序排列,提前做好聚合计算,再存储。并且它的数据存储格式自带索引。
其次,ClickHouse可以基于多个Key创建索引。它的二级索引采用Data skipping index。

5.EMR ClickHouse架构

ClickHouse-1_概述_数据_08
我们在ClickHouse的基础上做了一定的增强。首先,我们重构了In Memory Part写入模块,让它支持Flink单条写入,Flink Exactly Once事务写入以及Sharding Key写入。成功解决了写Distributed表的痛点,提升了整体性能。其次,它还支持DiskOSS。实现了冷热的分层存储,节约了成本。最后,我们实现了副本扩容和分片扩容,让扩容方式变得更灵活。