clickhouse问题总结(持续更新)
2024-07-23 10:11:52 # clickhouse # 问题总结

Clickhouse问题总结(持续更新)

ReplacingMergeTree能保证一定不重复吗

不能保证,因为ReplacingMergeTree的去重只会在分区内部去重,不能跨分区的去重

ReplacingMergeTree只适合后台清除重复数据节省空间

clickhouse的数据一致性

首先说一下数据一致性的产生

ReplacingMergeTree引擎会数据写入的时候存储,不会立刻合并,合并的时候会将有相同主键的记录按照插入时间戳保留最新的数据

SummingMergeTree引擎数据写入也不会直接合并,合并的时候会进行一个求和操作保留聚合结果

数据不一致是因为数据写入后,合并不会立刻执行,这时候的数据有多个版本的情况

解决:有三种方式解决:

  1. 手动合并(不推荐,资源问题)
  2. group by去重,按照创建时间取最新的值(太麻烦)
  3. 创建视图用group by视图去操作
  4. 使用final查询,但是final查询比普通查询慢,因为final读数据时候没有并行

clickhouse的ReplacingMergeTree指定order by和版本,如果不指定版本的话写入数据的时候保留哪条数据

ReplacingMergeTree中指定版本的意思就是

1
2
3
4
5
6
7
8
9
10
CREATE TABLE t_order_rmt(
id Int32,
sku_id String,
total_amount Decimal(15,2),
create_time DateTime
)
engine = ReplaceMergeTree(create_time)
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id,sku_id);

中的ReplaceMergeTree(create_time)后面添加上了create_time,如果不指定版本的话就会保留最后一条被读取到的记录,但是不是插入的最后一条,而是内部存储顺序的最后一条数据

clickhouse都有哪些表的概念

分片表和副本表

ReplacingMergeTree直接轮询写的话能去重吗

理论上是可以的,但是要保证数据一致性和去重效果,合并的操作的实际

市面上常见的数数据湖的优劣

clickhouse怎么保持幂等性

幂等性就是重复执行操作,结果不变

ReplacingMergeTree设置主键,数据合并保留最新版本

SummingMergeTree对相同主键的数据求和

kafka和ck的应用场景

kafka是实时

ck是高性能查询,列式存储+向量化执行引擎

clickhouse为什么查询快

  1. 列式索引
  2. LSM Tree的结构,顺序写入数据,写入后数据不可更改
  3. 向量化执行引擎
  4. 数据划分分区,每个分区划分多个索引,多个cpu核处理可以并行处理;但是在高并发的情况下可能会资源抢占11·
  5. 稀疏索引,每个数据都有索引,比如索引abcdef,每隔一段取一个,这样就可以减少索引的存储空间,比如是acf,如果查询e就知道在c和f之间,顺序找e
  6. 物化视图
  7. 临时数据存放内存表
  8. explain查询优化,很多向量化函数

clickhouse适用哪些业务场景

实时分析,时序数据存储和分析,比如监控或者物联网数据分析

Clickhouse 和elasticsearch 的区别,应用场景的区别,底层的区别

Clickhouse:

  1. 列式数据库,主要用于实时分析和OLAP场景
  2. 底层是列式存储,支持向量化执行引擎,数据压缩
  3. 应用于实时分析,时序数据处理,数仓

ES:

  1. 分布式搜索引擎,主要用于全文搜索,日志分析
  2. 底层是json文档存储,倒排索引,分布式框架,近实时性
  3. 应用场景:日志分析,全文搜索,监控预警

比较:

  1. Clickhouse使用列式存储,适合分析查询和大规模数据处理;ES使用文档存储,倒排索引,适合全文搜索和日志分析
  2. CK支持SQL查询语言,ES近实时数据检索,适合复杂文本查询
  3. CK对列的聚合和过滤操作很棒,ES在全文搜索和实时数据检索下有优势,适合高并发的搜索请求

clickhouse和doris对比

clickhouse是一个列存储的数据库,是无共享架构,也就是每个节点都是独立的,支持分布式查询

doris是一个MPP架构,支持多种存储格式,具有统一的查询引擎

clickhouse的数据导入支持CSV,JSON等格式导入数据,支持流式导入数据,实时处理数据

doris:

  • 使用更加简单,sql标准支持更好,join更好
  • 运维更简单,故障节点自动恢复
  • 分布式更强,多种聚合模型
  • 支持多种导入方式
  • doris的导入都是事务的,要不都成功要不都失败

clickhouse:

  • 性能更好,导入性能和单表查询性能更好
  • 功能支持多种表引擎,和各种函数的优化
  • 集群管理工具更多
  • clickhouse不支持事务

业务场景复杂,数据量大,肯定是clickhouse;希望直接分析解决方案,肯定是doris

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
--创建kafka表
CREATE TABLE kafka_table (
key String,
value String
) ENGINE = Kafka
SETTINGS
kafka_broker_list = 'localhost:9092',
kafka_topic_list = 'your_topic',
kafka_group_name = 'group1',
kafka_format = 'JSONEachRow',
kafka_num_consumers = 1;

--创建 MergeTree 表:创建一个目标表,用于存储从 Kafka 消费的数据
CREATE TABLE target_table (
key String,
value String
) ENGINE = MergeTree()
ORDER BY key;

--创建物化视图:创建一个物化视图,从 Kafka 表读取数据并插入到目标表中。
CREATE MATERIALIZED VIEW mv TO target_table AS
SELECT
key,
value
FROM kafka_table;

doris支持通过mysql协议导入,broker load ,stream load;支持实时导入,可以从多种数据源直接导入

clickhouse索引

稀疏索引

clickhouse怎么处理宽表

  1. 拆分宽表
  2. 将宽表做成分区表
  3. 数据压缩
  4. 查询的时候只选择需要的列
  5. 使用物化视图
  6. 二级索引

clickhouse存储流程

  1. 数据写入的时候根据分区键将数据根据分区存储
  2. ck水平分片,将数据分布到多个节点
  3. 写入数据到内存表中
  4. 定期将数据刷新到磁盘,数据块列式存储