clickhouse基本介绍

2020-04-28  本文已影响0人  做量化的程序员

什么是clickhouse?

ClickHouse 是一个列式存储的高效能分析性数据管理系统,具有
原生的向量化执行引擎,Developed by Yandex, opne source since 2016

官网: ClickHouse is a column-oriented database management system (DBMS) for
online analytical processing of queries (OLAP)

为什么clickhouse脱颖而出

感人的性能

特性

数据压缩、磁盘存储

在一些列式数据库管理系统中(例如InfiniDB CE和MonetDB) 并没有使用数据压缩。但是, 若想达到比较优异的性能,数据压缩确实起到了至关重要的作用。

许多的列式数据库(如 SAP HANA, Google PowerDrill)只能在内存中工作,这种方式会造成比实际更多的设备预算。ClickHouse被设计用于工作在传统磁盘上的系统,它提供每GB更低的存储成本,但如果有可以使用SSD和内存,它也会合理的利用这些资源

提供 LZ4、ZSTD 两种数据压缩格式

支持SQL

ClickHouse支持基于SQL的声明式查询语言,该语言大部分情况下是与SQL标准兼容的。
支持的查询包括 GROUP BY,ORDER BY,IN,JOIN以及非相关子查询。
绝大部分查询基本和常用的mysql一样,可以省去大部分同学的学习成本。不仅如此提供了强大的函数支查询能力,更丰富的存储格式,例如array多维数组、json、tuple、set等。

ps:我们就用这个解决了变态的产品提的变态需求,实时查询千亿数据下根据数组下标的等值查询和数据包含的范围查询。性能还不错

多核心并行处理

ClickHouse会使用服务器上一切可用的资源,从而以最自然的方式并行处理大型查询

向量化引擎

为了高效的使用CPU,数据不仅仅按列存储,同时还按向量(列的一部分)进行处理,这样可以更加高效地使用CPU

索引
  • 主键

ClickHouse支持主键索引,它将每列数据按照index granularity(默认8192行)进行划分,会为每个数据片段创建一个索引文件,索引文件包含每个索引行(『标记』)的主键值。索引行号定义为 n * index_granularity 。当数据被插入到表中时,会分成数据片段并按主键的字典序排序。例如,主键是 (CounterID, Date) 时,片段中数据按 CounterID 排序,具有相同 CounterID 的部分按 Date 排序。
但是值得注意的是:ClickHouse 不要求主键惟一。所以,你可以插入多条具有相同主键的行。要想实现去重效果,需要结合具体的表引擎ReplacingMergeTree、CollapsingMergeTree、VersionedCollapsingMergeTree实现。

  • 稀疏索引

ClickHouse支持对任意列创建任意数量的稀疏索引。其中被索引的value可以是任意的合法SQL Expression,并不仅仅局限于对column value本身进行索引。之所以叫稀疏索引,是因为它本质上是对一个完整index granularity(默认8192行)的统计信息,并不会具体记录每一行在文件中的位置。

支持近似计算

ClickHouse提供各种各样在允许牺牲数据精度的情况下对查询进行加速的方法:

  1. 用于近似计算的各类聚合函数,如:distinct values, medians, quantiles
  2. 基于数据的部分样本进行近似查询。这时,仅会从磁盘检索少部分比例的数据。
  3. 不使用全部的聚合条件,通过随机选择有限个数据聚合条件进行聚合。这在数据聚合条件满足某些分布条件下,在提供相当准确的聚合结果的同时降低了计算资源的使用。
丰富的表引擎

clickhouse 不仅拥有自己强大的MergeTree家族的多种引擎外,还提供了丰富的外部引擎供我们选择,包括但不限于:kafka、HDFS、Mysql。
但是使用外部引擎的时,性能自然会不如本地存储。

MergeTree引擎家族中很有很多优秀的引擎
比如:
    适合人物画像的AggregatingMergeTree引擎
    可自定义去重的SummingMergeTree引擎
    折叠树CollapsingMergeTree
    用于Graphite监控的GraphiteMergeTree引擎
    。。。
这些都具有数据副本的能力  Replicated*
官方推荐的适合大多数场景的依然是MergeTree引擎,其家族中其他引擎大多也是在其基础上做的封装。

除此之外,还有分布式的表引擎。Distributed
Distributed是一种逻辑表引擎,并不存储数据。创建该表引擎时,会指向已配置的分片集,要查询的时候,它会向每个分片发起查询并最终汇总集合然后返回。
这里配置分片集可超灵活的配置,不用的时候可以删除。以后会单独来介绍该引擎的使用。

数据分区PARTITION

ClickHouse支持PARTITION BY子句,在建表时可以指定按照任意合法表达式进行数据分区操作,比如通过toYYYYMM()将数据按月进行分区、toMonday()将数据按照周几进行分区。分区条件查询,只能读取包含适当分区数据块,而不扫描过多的数据。灵活的使用,可以大大提升查询的性能。

限制

没有完美的设计,只有适合的设计。
clickhouse也有自己的限制。

总结

  1. 数据被添加到数据库,基本不怎么修改。
  2. 查询并发相对不高。
  3. 大宽表存储,少部分字段使用。
  4. 批量操作,更新或者删除。
  5. 列值相对小,数字或者短字符串。
  6. 无事务处理。

用于存储数据和统计数据使用
用户行为数据记录和分析工作
日志分析

其他

Clickhouse官方还贴心给出中文官方文档,就是看着不太顺眼,还是英文的舒服。
随着开源,国内各大厂商都纷纷跟进,在头条、腾讯、携程、快手都有大规模使用。
目前阿里云已经率先推出了ClickHouse的云托管产品,处于公测阶段。感兴趣的小伙伴可以去使用,一起学习。

如有错误,希望大家批评指正。

上一篇下一篇

猜你喜欢

热点阅读