Clickhouse问题总结(持续更新)
ReplacingMergeTree能保证一定不重复吗
不能保证,因为ReplacingMergeTree的去重只会在分区内部去重,不能跨分区的去重
ReplacingMergeTree只适合后台清除重复数据节省空间
clickhouse的数据一致性
首先说一下数据一致性的产生
ReplacingMergeTree引擎会数据写入的时候存储,不会立刻合并,合并的时候会将有相同主键的记录按照插入时间戳保留最新的数据
SummingMergeTree引擎数据写入也不会直接合并,合并的时候会进行一个求和操作保留聚合结果
数据不一致是因为数据写入后,合并不会立刻执行,这时候的数据有多个版本的情况
解决:有三种方式解决:
- 手动合并(不推荐,资源问题)
- group by去重,按照创建时间取最新的值(太麻烦)
- 创建视图用group by视图去操作
- 使用final查询,但是final查询比普通查询慢,因为final读数据时候没有并行
clickhouse的ReplacingMergeTree指定order by和版本,如果不指定版本的话写入数据的时候保留哪条数据
ReplacingMergeTree中指定版本的意思就是
1 | CREATE TABLE t_order_rmt( |
中的ReplaceMergeTree(create_time)
后面添加上了create_time,如果不指定版本的话就会保留最后一条被读取到的记录,但是不是插入的最后一条,而是内部存储顺序的最后一条数据
clickhouse都有哪些表的概念
分片表和副本表
ReplacingMergeTree直接轮询写的话能去重吗
理论上是可以的,但是要保证数据一致性和去重效果,合并的操作的实际
市面上常见的数数据湖的优劣
clickhouse怎么保持幂等性
幂等性就是重复执行操作,结果不变
ReplacingMergeTree设置主键,数据合并保留最新版本
SummingMergeTree对相同主键的数据求和
kafka和ck的应用场景
kafka是实时
ck是高性能查询,列式存储+向量化执行引擎
clickhouse为什么查询快
- 列式索引
- LSM Tree的结构,顺序写入数据,写入后数据不可更改
- 向量化执行引擎
- 数据划分分区,每个分区划分多个索引,多个cpu核处理可以并行处理;但是在高并发的情况下可能会资源抢占11·
- 稀疏索引,每个数据都有索引,比如索引abcdef,每隔一段取一个,这样就可以减少索引的存储空间,比如是acf,如果查询e就知道在c和f之间,顺序找e
- 物化视图
- 临时数据存放内存表
- explain查询优化,很多向量化函数
clickhouse适用哪些业务场景
实时分析,时序数据存储和分析,比如监控或者物联网数据分析
Clickhouse 和elasticsearch 的区别,应用场景的区别,底层的区别
Clickhouse:
- 列式数据库,主要用于实时分析和OLAP场景
- 底层是列式存储,支持向量化执行引擎,数据压缩
- 应用于实时分析,时序数据处理,数仓
ES:
- 分布式搜索引擎,主要用于全文搜索,日志分析
- 底层是json文档存储,倒排索引,分布式框架,近实时性
- 应用场景:日志分析,全文搜索,监控预警
比较:
- Clickhouse使用列式存储,适合分析查询和大规模数据处理;ES使用文档存储,倒排索引,适合全文搜索和日志分析
- CK支持SQL查询语言,ES近实时数据检索,适合复杂文本查询
- CK对列的聚合和过滤操作很棒,ES在全文搜索和实时数据检索下有优势,适合高并发的搜索请求
clickhouse和doris对比
clickhouse是一个列存储的数据库,是无共享架构,也就是每个节点都是独立的,支持分布式查询
doris是一个MPP架构,支持多种存储格式,具有统一的查询引擎
clickhouse的数据导入支持CSV,JSON等格式导入数据,支持流式导入数据,实时处理数据
doris:
- 使用更加简单,sql标准支持更好,join更好
- 运维更简单,故障节点自动恢复
- 分布式更强,多种聚合模型
- 支持多种导入方式
- doris的导入都是事务的,要不都成功要不都失败
clickhouse:
- 性能更好,导入性能和单表查询性能更好
- 功能支持多种表引擎,和各种函数的优化
- 集群管理工具更多
- clickhouse不支持事务
业务场景复杂,数据量大,肯定是clickhouse;希望直接分析解决方案,肯定是doris
1 | --创建kafka表 |
doris支持通过mysql协议导入,broker load ,stream load;支持实时导入,可以从多种数据源直接导入
clickhouse索引
稀疏索引
clickhouse怎么处理宽表
- 拆分宽表
- 将宽表做成分区表
- 数据压缩
- 查询的时候只选择需要的列
- 使用物化视图
- 二级索引
clickhouse存储流程
- 数据写入的时候根据分区键将数据根据分区存储
- ck水平分片,将数据分布到多个节点
- 写入数据到内存表中
- 定期将数据刷新到磁盘,数据块列式存储