ClickHouse实战处理(一):MergeTree表引擎

2024-05-25 20:12

本文主要是介绍ClickHouse实战处理(一):MergeTree表引擎,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MergeTree作为家族系列最基础的表引擎,主要有以下特点:

  1. 存储的数据按照主键排序:创建稀疏索引加快数据查询速度。
  2. 支持数据分区,可以通过PARTITION BY语句指定分区字段。
  3. 支持数据副本。
  4. 支持数据采样。

一、MergeTree分类和建表参数

MergeTree系列表引擎包含:MergeTree、ReplacingMergeTree、ReplicatedMergeTree(复制表)、SummingMergeTree(汇总求和功能)、AggregatingMergeTree(聚合功能)、CollapsingMergeTree(折叠删除功能)、VersionedCollapsingMergeTree(版本折叠功能)引擎,在这些的基础上还可以叠加Replicated和Distributed。

MergeTree在写入一批数据时,数据总会以数据片段的形式写入磁盘,且数据片段在磁盘上不可修改。为了避免片段过多,ClickHouse会通过后台线程,定期合并这些数据片段,属于相同分区的数据片段会被合成一个新的片段。这种数据片段往复合并的特点,也正是合并树名称的由来。

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],...INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2
) ENGINE = MergeTree()
ORDER BY expr
[PARTITION BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[TTL expr [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'], ...]
[SETTINGS name=value, ...]
​关于以上建表语句的解释如下:1、ENGINE:ENGINE = MergeTree(),MergeTree引擎没有参数。2、ORDER BY:排序字段。比如ORDER BY (Col1, Col2),值得注意的是,如果没有使用 PRIMARY KEY 显式的指定主键ORDER BY排序字段自动作为主键。如果不需要排序,则可以使用 ORDER BY tuple() 语法,这样的话,创建的表也就不包含主键。这种情况下,ClickHouse会按照插入的顺序存储数据。必选项。3、PARTITION BY:分区字段,例如要按月分区,可以使用表达式 toYYYYMM(date_column),这里的date_column是一个Date类型的列,分区名的格式会是"YYYYMM"。可选。4、PRIMARY KEY:指定主键,如果排序字段与主键不一致,可以单独指定主键字段。否则默认主键是排序字段。大部分情况下不需要再专门指定一个 PRIMARY KEY 子句,注意,在MergeTree中主键并不用于去重,而是用于索引,加快查询速度。可选。另外,如果指定了PRIMARY KEY与排序字段不一致,否则报错。要保证PRIMARY KEY 指定的主键是ORDER BY 指定字段的前缀,这样主键仍然是排序键的前缀,不会出现索引与数据顺序混乱的问题。
比如: 
.......
ORDER BY (A,B,C)
PRIMARY KEY A 5、SAMPLE BY:采样字段,如果指定了该字段,那么主键中也必须包含该字段。比如 SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID))。可选。6、TTL:数据的存活时间。在MergeTree中,可以为某个列字段或整张表设置TTL。当时间到达时,如果是列字段级别的TTL,则会删除这一列的数据;如果是表级别的TTL,则会删除整张表的数据。可选。7、SETTINGS:额外的参数配置。可选。

二、分区目录的合并过程

在将新数据插入表中时,每个分区的数据按照目录存储为单独的数据片段, 目录名为数据片段名称,这个和system.parts表的name字段一致。
在插入后的10-15分钟内,同一个分区的数据片段将合并为一个整体的数据片段。数据片段名称包含了4部分的信息,下面以数据片段20200421_1_2_1为例进行拆解:

  • 20200421是分区名称。
  • 1是数据块的最小编号。
  • 2是数据块的最大编号。
  • 1是块级别,即该块在MergeTree中的深度。
1、分区目录的合并过程
  1. active列为数据片段的状态。1表示激活状态,0表示非激活状态。当源数据片段合并为较大的片段之后,这些源的数据片段就变为了非激活状态。损坏的数据片段也是非激活状态。
  2. 同一分区有多个独立的数据片段,这表明这些片段尚未合并。
    ClickHouse会在插入后大约15分钟合并数据片段,也可以使用OPTIMIZE语句执行计划外的合并:
    OPTIMIZE TABLE mergeTableDemo PARTITION 202004;
  3. 非激活的片段(active=0片段)将在合并后约10分钟被删除。
  4. detached目录包含使用DETACHED语句从表分离的数据片段。 损坏的数据片段也将移至该目录,而不是被删除。ClickHouse不会使用detached目录中的数据片段。 此目录中的数据可以随时添加、删除或修改,ClickHouse只有在运行ATTACH语句时才会感知该目录。

3、MergeTree引擎表目录解析

这里我们介绍下MergeTree引擎表对应到磁盘的数据目录,Clikchouse新版本与之前版本对比,数据对应的磁盘目录略有不同。

创建表t_mt,并加载数据:

CREATE TABLE t_mt
(
id UInt8,
name String,
age UInt8,
birthday Date,
location String
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(birthday)
ORDER BY (id, age)

#向表t_mt中插入数据

insert into t_mt values (1,'张三',18,'2021-06-01','上海'), (2,'李四',19,'2021-02-10','北京'), (3,'王五',12,'2021-06-01','天津'), (1,'马六',10,'2021-06-18','上海'), (5,'田七',22,'2021-02-09','广州');

以上创建好表t_mt,当插入数据完成后,在ClickHouse节点/var/lib/ClickHouse/data/newdb/路径下会生成对应目录“t_mt”,进入此目录下,可以看到对应的分区目录,如图示:
在这里插入图片描述

以上分区目录也可以在系统表“system.parts”中查询得到:

#在系统表 system.part中查询表 t_mt的分区信息:
select table ,partition ,name ,active from system.parts where table = ‘t_mt’;

进入到某一个分区目录片段“202102_2_2_0”中,我们可以看到如下目录:

在这里插入图片描述

对以上目录的解释如下:

1、checksums.txt:校验文件,使用二进制格式存储。它保存了余下各类文件(primary. idx、count.txt等)的size大小及size的哈希值,用于快速校验文件的完整性和正确性。

2、columns.txt: 存储当前分区所有列信息。使用明文格式存储。

[root@node1 202102_2_2_0]# cat columns.txt
columns format version: 1
5 columns:
id UInt8
name String
age UInt8
birthday Date
location String

3、count.txt:计数文件,使用明文格式存储。用于记录当前数据分区目录下数据的总行数。

[root@node1 202102_2_2_0]# cat count.txt
2

data.bin:数据文件,使用压缩格式存储,默认为LZ4压缩格式,用于存储某一列的数据。之前clickhoue版本是每一个列字段都拥有独立的.bin数据文件,并以列字段名称命名,在新版本ClickHouse中所有数据合并到data.bin中。
之前ClickHouse版本此目录数据如下:
在这里插入图片描述
4、data.mrk3:列字段标记文件,使用二进制格式存储。标记文件中保存了data.bin文件中数据的偏移量信息。

5、default_compression_codec.txt:存储数据压缩格式

6、partition.dat与minmax_[Column].idx:如果指定了分区键,则会额外生成partition.dat与minmax索引文件,它们均使用二进制格式存储。partition.dat用于保存当前分区下分区表达式最终生成的值,即分区字段值;而minmax索引用于记录当前分区下分区字段对应原始数据的最小和最大值。比如当使用birthday字段对应的原始数据为2021-02-17、2021-02-23,分区表达式为PARTITION BY toYYYYMM(birthday),即按月分区。partition.dat中保存的值将会是202102,而minmax索引中保存的值将会是2021-02-17、2021-02-23。

7、primary.idx:一级索引文件,使用二进制格式存储。用于存放稀疏索引,一张MergeTree表只能声明一次一级索引,即通过ORDER BY或者PRIMARY KEY指定字段。借助稀疏索引,在数据查询的时能够排除主键条件范围之外的数据文件,从而有效减少数据扫描范围,加速查询速度。

三、数据标记的工作机制和数据查询

1、索引和主键

在这里插入图片描述
在这里插入图片描述

2、数据标记的工作机制在这里插入图片描述在这里插入图片描述
2、数据查询
  1. 确定分区(如果有)
  2. 根据primary.idx确定数据数据在哪些索引标记内。
  3. 根据索引标记和数据标记文件(.mrk或.mrk2)确定数据在哪个压缩数据块,以及在解压缩数据块中的偏移量
  4. 加载数据至内存,向量化操作、查询过滤。 ​

在这里插入图片描述

二、ReplicatedMergeTree

只有MergeTree系列引擎支持数据副本,支持副本的引擎是在MergeTree引擎名称的前面加上前缀Replicated,也就是ReplicatedMergeTree。副本是表级别的而不是整个服务器级别的,因此,
服务器可以同时存储复制表和非复制表。
1、和zookeeper的整合
1)ClickHouse使用Apache ZooKeeper来存储副本元信息, 在配置文件设置zookeeper相关的参数。
如果ClickHouse的配置文件未配置ZooKeeper,则无法创建复制表,并且任何存量的复制表都将是只读的。
2)对本地复制表的查询不会使用ZooKeeper, 其查询速度和非复制表一样快。
在这里插入图片描述

这篇关于ClickHouse实战处理(一):MergeTree表引擎的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1002509

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚