前文: 如何高效处理亿级海量数据-Clickhouse速通(上)
接前文,本文将主要讲解如何在已有表结构的基础上进行统计。

一. 存算一体
Clickhouse里可以直接进行实时统计。通常的数据库,一般都会进行存储和计算分离,数据库仅仅用于存储,而计算交由另外的程序执行。而Clickhouse则极大拓展了计算能力,使得可以直接在数据库里做好统计,其它程序仅仅做读取即可。
为什么这样做?这样做有哪些好处呢?
a. 减少数据读取。
假设数据量是10亿,如果交由外部程序进行数据分析,就需要将这10亿数据读出,而后再将计算后的数据写回数据库。这一次读写可能就需要非常长的时间。
b. 降低磁盘压力的同时,实时计算。
Clickhouse允许使用MergeTree引擎,在数据写入的时候就进行一些统计计算,从而不需要再将数据反复读出。从而可以将统计结果以近实时的速度得出。一方面减轻了磁盘压力,也节省了整体的资源消耗,另一方面可以进行实时分析。
c. 横向扩展方便。
还有一点就是Clickhouse是使用的shared-nothing架构,意味着每一个节点的增加都能同步等比例增加计算、存储能力。如此就省却了额外的计算节点的扩容的维护环节。
当然有利就会有弊,在本文结尾处会讨论一些Clickhouse的弊端。
二. 如何实现?
利用MergeTree引擎的特性,小批量统计,后台合并。
Clickhouse的统计函数很多,在查询的时候很好用。但更好用的是结合MergeTree引擎的特性,使用统计函数进行实时统计。
关于MergeTree和索引有很多解释很好的文章,这里仅做一个简单的解释。MergeTree的特点是,有数据就直接按照整个批量(part)写入磁盘,而后再后台按照周期进行合并每个part。MergeTree规定了一个叫颗粒度的参数,默认值是8192 (2的13次方)。后台合并的时候,Clickhouse会将各个part进行排序、归并等操作,并以8192为大小来划分颗粒度,按照颗粒进行记录索引。
MergeTree的批量写入和定期合并特性,可以让实时统计发挥作用。在小批量写入的时候,可以做局部统计;在后台合并的时候,可以将局部统计合并成更多批量汇总的统计结果。
用一个小例子说明:
1. 假设一个数据是用来记账的,两条数据如下:苹果,15元;午餐,30元;2. 这是午餐买的东西。两个数据一次性写入,那么就可以计算一下总计:2024/7/16 支出,45元3. 到了晚上你又有一笔开支,假设还是两条:饮料,5元;晚餐,15元;4. 两个数据还是一次性写入,那么就可以计算一下这个批次的总计:2024/7/16 支出,20元5. 后台有个定时程序会合并这两个数据:2024/7/16 支出 65 元6. 当你过了一会儿,比如1分钟后去查询的时候,就会看到这个最终的结果65,而不是分开的两条数据。
Clickhouse就是用类似的思路,来达成实时分析的,类似小计+汇总。使用的是SummingMergeTree或者AggregatingMergeTree等表引擎用来存储,都是属于MergeTree家族的。按照给定的查询语句,利用物化视图将统计数据发送到存储表,而后存储表会后台合并统计结果。一般流程如下:
原始数据表 ->物化视图(含统计语句) ->结果发送到存储表(SummingMergeTree/AggregatingMergeTree) ->后台合并各个批次的统计结果 ->查询最终统计结果
三. 利用Clickhouse统计的流程
下文会按照以下步骤介绍如何使用Clickhouse进行统计。这个流程是比较完整的使用过程,方便产品中使用。如果只是简单统计,也可以参照官方案例,直接创建物化视图,不创建中间表。
1. 基于现有的数据表;
2. 创建物化视图的存储表;
3. 插入已有数据;
4. 创建物化视图;
5. 插入新

最低0.47元/天 解锁文章
&spm=1001.2101.3001.5002&articleId=140949940&d=1&t=3&u=f1d393aa2d7d4c2b8f2bc7014e3217dc)
398

被折叠的 条评论
为什么被折叠?



