clickhouse初学以及利用ck实现BI系统的增量更新

概述

clickhouse官方文档 https://clickhouse.com/docs/zh/
clickhouse是OLAP的列式数据库,底层是C++编写的。
相比于OLTP在线事务的处理,clickhouse更关注于海量数据的计算分析,关注的是数据吞吐、查询速度、计算性能等指标,对于数据频繁变更不太擅长,所以clickhouse通常用来构建后端的离线和实时数仓。

适用场景

1、绝大多数都是读请求,对数据的修改比较少或者几乎没有
2、数据量很大,既包括数据的行数,也包括数据的列数(宽表)
3、数据通常是大的批次进行更新而不是单行更新
4、对事务的要求不是必须的,通常只要求数据最终一致性
5、clickhouse对内存以及cpu的要求特别高

库引擎(部分)

1、Atomic

clickhouse默认的库引擎,它支持非阻塞的DROP TABLE和RENAME TABLE查询和原子的EXCHANGE TABLES t1 AND t2查询。

2、Lazy

类似于日志的功能,在最后一次访问之后,只在RAM中保存expiration_time_in_seconds秒。只能用于*Log表。

建库语句:
CREATE DATABASE testlazy ENGINE = Lazy(expiration_time_in_seconds);

3、Mysql、SQLite、PostergreSQL等一系列

拿Mysql举例,相当于通过clickhouse来连接Mysql的是数据库,可以执行insert、delete等sql语句,但不能执行create table、alter、rename等sql语句。这些库引擎,在clickhouse中不存储数据,只是将请求转发给了Mysql。

建库语句:
CREATE DATABASE test_database
ENGINE = PostgreSQL(‘host:port’, ‘database’, ‘user’, ‘password’[, use_table_cache]);

数据类型(部分)

注意大小写(ck严格要求大小写)

1、整型
Int8 Int16 Int32 Int64

2、无符号整型
UInt8 UInt16 UInt32 UInt64

3、浮点型
Float32 Float64

4、Decimal类型
Decimal32(s) Decimal64(s) Decimal128(s)

5、字符型
String

6、时间类型
Date 2022-03-01
Datetime 2022-03-01 10:10:10
Datetime64 2022-03-01 10:10:10.230

7、可为空类型
官方:总是对性能产生负面影响
Nullable
Create table test(x Nullable(Int8)) engine =

8、UUID类型
自动生成无序的随机数, select generateUUIDv4()

表引擎-合并树系列

在这里插入图片描述

MergeTree所有系列的表引擎前都可加前缀 Replicated 是支持数据副本的意思

ReplacingMergeTree

在这里插入图片描述

SummingMergeTree

在这里插入图片描述

分区

[PARTITION BY expr]

查询本地表的分区SQL:select partition from system.parts where table = ’ ';
1、在服务器上,每张表里的数据分区样式,下图是例子t_stock表
在这里插入图片描述
第一个_1代表数据块最小的编号,第二个_1代表数据块最大的编号,_0代表合并的次数

2、再看看每个数据块里的数据:
在这里插入图片描述
data.bin 里存着压缩后的数据
columns.txt是列信息

3、服务器上的查询结果:
在这里插入图片描述

clickhouse底层的合并操作Merge

数据从内存写入硬盘的操作称为合并操作,

合并方式有两种:
方式一:clickhouse后台会不定时的自动执行合并操作(3-5分钟?)
方式二:手动干预合并 sql:optimize table tableName final;
1、看看新增数据后,没有合并前的效果
在这里插入图片描述
在这里插入图片描述
2、手动干预合并后的效果
在这里插入图片描述
3、合并前和合并后的数据块截图
在这里插入图片描述合并后不会删除掉之前的数据块,ck后期会有一个大合并,这时才会删掉废弃的数据块

排序键

ORDER BY exper
order by可以设置多个字段列
在这里插入图片描述

主键

[PRIMARY KEY expr]
在这里插入图片描述

数据修改删除SQL语法

在这里插入图片描述修改和删除操作,会新产生一个临时分区,原始的数据会打一个删除的标记,频繁的修改和删除会产生大量的临时分区,会进行大量的合并,服务器压力就变大了

数据副本

clickhouse副本和副本之间没有主从关系
在这里插入图片描述

分布式表引擎

可以通过 [create table ‘tableName’ on cluster logs] 来进行,on cluster logs表示在logs这个集群上执行
在这里插入图片描述

读写流程(概述)

分布式表写入流程

1、设置同步or异步的配置
insert_sync = ture时表示同步写入,配合insert_timeout参数使用,i
Insert_sync = false 时表示异步写入

同步写入是指数据直接写入实际的表中,而异步写入是指数据首先被写入本地文件系统,然后发送到远端节点

2、写入流程
2.1、
Internal_reliaction参数,false时,所有副本,都由分布式表来完成写入操作
Internal_reliaction参数,true时,只有每个分片中的一个副本由分布式表来完成写入操作。

2.2、true时,使用到了数据副本的机制,当分片1中r1给r2同步时,r2挂掉了,在r2恢复后,会有一个重试的操作。

2.3、写入是有一个数据权重分配策略,可以配置的
在这里插入图片描述

读流程

每个副本上都有一个errors_count的一个错误记录,当读取命令打在分布式表上时,分布式表会优先选择errors_count小的副本进行读取
在这里插入图片描述

读相关的数据一致性问题

https://cloud.tencent.com/developer/article/1748216

SQL优化方面的使用建议

clickhouse支持explan进行查询执行计划等操作,详情见开发文档https://clickhouse.com/docs/zh/sql-reference/statements/explain/

sql上的注意事项:https://www.jianshu.com/p/e5050f046699

BI系统中数据的增量更新(replace into)

Asteria增量更新如何实现?
1、查询ck本地表中的分区sql
select partition from system.parts where table = ‘’;

2、Ck表的分区是如下两种格式(clickhouse_version_value是插入ck表时这批数据的版本号,时间戳)
2.1、设置里以date类型的字段为分区
PARTITION BY (clickhouse_version_value, toYYYYMMDD(toDate(substring(‘field_value’, 1, 10))))
对应的ck里的分区样式 (‘20220324081602’,20220314)
2.2、默认无设置数据集分区
PARTITION BY (clickhouse_version_value, toYYYYMM(clickhouse_version_value))

3、数据replace into流程举例
3.1、增量更新第一次更新,表中的数据:

DayorderIdpriceasteria_orderclickhouse_version_value
20220324订单号一20元120220324101010
20220324订单号二15元220220324101010
20220325订单号三19元320220324101010

3.2、增量更新,第二次运行sql查询出来的数据:

DayorderIdpriceasteria_orderclickhouse_version_value
20220325订单号三22元420220324202020
20220325订单号四31元520220324202020
20220326订单号五32元620220324202020

3.3、查询出每个本地表中的旧分区信息
(20220324101010, 20220324)
(20220324101010, 20220325)

3.4、将第二次sql查询出的数据插入ck表中

3.5、查询clickhouse_version_value = ‘20220324202020’ 的字段day的数据
20220325、20220326

3.6、对3.2中旧分区的右半部分进行匹配,删除掉新增的数据中匹配成功的day数据,即:20220305
Alter table tableNamecluster drop partiton (20220324101010, 20220325);

3.7、结束,最后表中的数据如下图

DayorderIdpriceasteria_orderclickhouse_version_value
20220324订单号一20元120220324101010
20220324订单号二15元220220324101010
20220325订单号三22元420220324202020
20220325订单号四31元520220324202020
20220326订单号五32元620220324202020
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值