如何高效处理亿级海量数据-Clickhouse速通(下)

前文: 如何高效处理亿级海量数据-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. 插入新

### ClickHouse入门教程 #### 创建表 为了创建一张新表,可以使用 `CREATE TABLE` 语句。此操作允许指定存储引擎以及列定义和其他选项。例如: ```sql CREATE TABLE example_table ( id UInt32, name String, value Float64 ) ENGINE = MergeTree() ORDER BY id; ``` 这段SQL命令会建立一个名为 `example_table` 的表格,并设置它的结构和所使用的存储引擎为 `MergeTree()`[^1]。 #### 启动服务 在各个节点上可以过执行如下指令来启动ClickHouse的服务: ```bash sudo service clickhouse-server start ``` 这一步骤对于确保集群中的每一个实例都处于运行状态至关重要[^3]。 #### 数据查询与JOIN操作 当涉及到多张表之间的连接时,需要注意的是每张表仅能进行一次JOIN操作。然而,过嵌套SELECT子查询的方式能够实现多次JOIN的效果。另外,利用IN表达式也可以达到类似的目的并且常具有更好的性能表现。例如: ```sql SELECT t1.id, t1.name FROM table1 AS t1 WHERE t1.uid IN (SELECT uid FROM table2); ``` 对于跨服务器的数据关联,则需采用带有GLOBAL关键字的形式来进行全局范围内的JOIN或IN查找[^5]。 #### 特性和优势 ClickHouse最初由Yandex公司于2016年推出并开源,旨在克服传统关系型数据库面对海量数据分析场景下的效率低下问题。它以其卓越的度著称,在处理大规模数据集方面表现出色。随着时间推移和技术进步,该平台不仅保持了高性能的特点,还赢得了广泛的认可和支持,成为了大数据生态系统中不可或缺的一部分[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值