ClickHouse列式数据库管理系统(DBMS)

2021-10-19 雨辰 遇到的一些问题

ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。是俄罗斯第一大搜索引擎Yandes开发

在传统的行式数据库系统中,数据按如下顺序存储:

Row WatchID JavaEnable Title GoodEvent EventTime
#0 89354350662 1 Investor Relations 1 2016-05-18 05:19:20
#1 90329509958 0 Contact us 1 2016-05-18 08:10:20
#2 89953706054 1 Mission 1 2016-05-18 07:38:00
#N

处于同一行中的数据总是被物理的存储在一起。

常见的行式数据库系统有:MySQLPostgresMS SQL Server

在列式数据库系统中,数据按如下的顺序存储:

Row: #0 #1 #2 #N
WatchID: 89354350662 90329509958 89953706054
JavaEnable: 1 0 1
Title: Investor Relations Contact us Mission
GoodEvent: 1 1 1
EventTime: 2016-05-18 05:19:20 2016-05-18 08:10:20 2016-05-18 07:38:00

这些示例只显示了数据的排列顺序。来自不同列的值被单独存储,来自同一列的数据被存储在一起。

常见的列式数据库有: Vertica、 Paraccel (Actian Matrix,Amazon Redshift)、 Sybase IQ、 Exasol、 Infobright、 InfiniDB、 MonetDB (VectorWise, Actian Vector)、 LucidDB、 SAP HANA、 Google Dremel、 Google PowerDrill、 Druid、 kdb+。

不同的数据存储方式适用不同的业务场景,数据访问的场景包括:进行了何种查询、多久查询一次以及各类查询的比例;每种类型的查询(行、列和字节)读取多少数据;读取数据和更新之间的关系;使用的数据集大小以及如何使用本地的数据集;是否使用事务,以及它们是如何进行隔离的;数据的复制机制与数据的完整性要求;每种类型的查询要求的延迟与吞吐量等等。

系统负载越高,依据使用场景进行定制化就越重要,并且定制将会变的越精细。没有一个系统能够同时适用所有不同的业务场景。如果系统适用于广泛的场景,在负载高的情况下,要兼顾所有的场景,那么将不得不做出选择。是要平衡还是要效率?

-----------------------------------------------------------------------------------------------------------

在我们项目中 Clickhouse 早早就部署上了, 但是一直没怎么用, 近期慢慢的把一些新的需求放到了clickhouse上去开发。

作为一个分布式OLAP数据库,Clickhouse支持了列式存储,数据分片,节点副本,并行计算,外部表等功能,同时可以集成Mysql, MongoDB, Kafka, RabbitMQ, PostgreSQL等数据源, 数据集成时省去了大量ETL开发工作。


    Clickhouse 主打MergeTree引擎,单个MergeTree表数据按PK顺序存储,这个PK的选择对于数据处理的性能非常关键,选用业务场景中需要的字段做排序,可以有效的提高数据读取的速度,


    当然也可以建索引来加快数据检索速度,目前Clickhouse仅支持MergeTree上的index,记得在add index 以后要 'OPTIMIZE TABLE *** FINAL' 命令index才生效。 


    如果单机性能不足需要分布式表的话,支持通过ReplicatedMergeTree把多个节点上的MergeTree表组建分布式表。

Clickhouse内置函数相比其他数据库要丰富许多,对于数据类型要求比较严格,绝大部分类型需要手动转换,尤其是复杂类型(json ,array,map等)的处理,比如: json可以通过JSONExtractKeysAndValuesRaw 转换 Array(Tuple),再使用arrayCount + lambda表达式对满足要求的kv对计数。

    新版本的Clickhouse终于加入了窗口函数,在客户端连接时 使用参数allow_experimental_window_functions=1 即可使用,这样在窗口排序时就不再需要使用array functions后再join了,节省了大量的内存。

    除了没有With CTE语句,分布式的操作稍微复杂点以外,数据计算的时候还是挺好用得。



https://clickhouse.com/docs/zh/

标签: 技术问题

发表评论:

朱文华 joyimp|@2011-2021 京ICP备16030765号-2