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, 其查询速度和非复制表一样快。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/840831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[emailprotected](2)核心概念-JSX

目录 1,什么是 jsx2,空标签3,通过大括号使用 js4,防止注入攻击5,元素的不可变性 官方文档 1,什么是 jsx Facebook 起草的 js 扩展语法。本质上是 js 对象,会被 babel 编译,最终转换…

军队仓库管理系统|DW-S301系统特点

部队仓库管理系统DW-S301系统通过数据采集、互联网和物联网技术,实现数字化智能管控,以提高军用物资的仓储准确率和流转率,缩短周转时间,降低库存成本,也有助于消除生产过程中的不确定性。 系统功能:通过部…

web学习笔记(五十六)

目录 1.绑定类名和style 1.1 绑定类名 1.1.1 绑定单个类名 1.1.2 绑定多个类名 1.2 style相关知识 2. vue的响应式原理 3. v-once 4.本地搭建Vue单页应用 4.1 安装Vue脚手架 4.2 安装对应的包文件 4.3 运行项目 1.绑定类名和style 1.1 绑定类名 1.1.1 绑定单个类名…

计算机网络协议

网络协议 基于TCP的应用层协议 POP3(Post Office Protocol 3): 用于支持客户端远程管理服务器上的电子邮件。它支持**“离线”邮件处理**,即邮件发送到服务器上后,一旦邮件被POP3客户端下载到本地计算机,…

NL6621 实现获取天气情况

一、主要完成的工作 1、建立TASK INT32 main(VOID) {/* system Init */SystemInit();OSTaskCreate(TestAppMain, NULL, &sAppStartTaskStack[NST_APP_START_TASK_STK_SIZE -1], NST_APP_TASK_START_PRIO); OSStart();return 1; } 2、application test task VOID TestAp…

网页上的超链接复制到Excel中+提取出网址+如何保存

定义 超链接网页标题地址栏 使用的工具 2024年的WPS是不行的, 如果把知乎网页上的超链接复制到WPS中的Excel中,就会丢掉地址,只剩下网页标题 具体操作(转载,在Excel2013上验证可行) [1]启用【开发工具】&#xff…

Golang net/http标准库常用方法(三)

大家好,针对Go语言 net/http 标准库,将梳理的相关知识点分享给大家~~ 围绕 net/http 标准库相关知识点还有许多章节,请大家多多关注。 文章中代码案例只有关键片段,完整代码请查看github仓库:https://github.com/hltfa…

科技前沿:IDEA插件Translation v3.6 带来革命性更新,翻译和发音更智能!

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

利用天气API接口自己DIY一个预报小管家

天气预报查询API 是一种实用的日常工具,它通过编程方式为开发者提供实时的天气数据。开发者可以通过简单的代码调用,与天气预报服务提供商进行交互,获取特定地区的天气信息,如温度、湿度、风速、风向、降水量等,以及未…

OWASP top10--SQL注入(一)

SQL注入式攻击技术,一般针对基于Web平台的应用程序.造成SQL注入攻击漏洞的原因,是由于程序员在编写Web程序时,没有对浏览器端提交的参数进行严格的过滤和判断。用户可以修改构造参数,提交SQL查询语句,并传递至服务器端…

XILINX FPGA DDR 学习笔记(一)

DDR 内存的本质是数据的存储器,首先回到数据的存储上,数据在最底层的表现是地址。为了给每个数据进行存放并且在需要的时候读取这个数据,需要对数据在哪这个抽象的概念进行表述,我们科技树发展过程中把数据在哪用地址表示。一个数…

K8S认证|CKA题库+答案| 11. 创建PVC

11、创建PVC 您必须在以下Cluster/Node上完成此考题: Cluster Master node Worker node ok8s master …

失落的方舟台服预下载教程 一键下载+账号注册教程

失落的方舟台服预下载教程 一键下载+账号注册教程 是一款今年备受瞩目的游戏,将于5月30日正式上线,这款游戏搭建在虚幻引擎的基础上,为玩家们带来了极佳的视觉体验。这款游戏秉承着MMO类型游戏一贯的玩法,但是制作组在…

海康威视硬盘录像机NVR连接公网视频监控平台,注册失败,抓包发现有403 forbidden的问题解决

目录 一、问题描述 二、问题定位 1、查看DVR的配置 2、查看需要使用的端口是否开放 3、查看日志 4、抓包 (1)找出错误 (2)查看数据包内容 三、问题分析 1、国标28181中的域的概念 2、域应该如何定义 (1&am…

ChatGPT可以开车吗?分享大型语言模型在自动驾驶方面的应用案例

自动驾驶边缘案例需要复杂的、类似人类的推理,远远超出传统的算法和人工智能模型。而大型语言模型正在致力实现这一目标。 人工智能技术如今正在快速发展和应用,人工智能模型也是如此。拥有100亿个参数的通用模型的性能正在碾压拥有5000万个参数的任务特…

缓存IO与直接IO

IO类型 缓存 I/O 缓存 I/O 又被称作标准 I/O,大多数文件系统的默认 I/O 操作都是缓存 I/O。在 Linux 的缓存 I/O 机制中,数据先从磁盘复制到内核空间的缓冲区,然后从内核空间缓冲区复制到应用程序的地址空间(用户空间&#xff0…

提示优化 | PhaseEvo:面向大型语言模型的统一上下文提示优化

【摘要】为大型语言模型 (LLM) 制作理想的提示是一项具有挑战性的任务,需要大量资源和专家的人力投入。现有的工作将提示教学和情境学习示例的优化视为不同的问题,导致提示性能不佳。本研究通过建立统一的上下文提示优化框架来解决这一限制,旨…

Langchain-Chatchat的markdownHeaderTextSplitter使用

文章目录 背景排查步骤官方issue排查测试正常对话测试官方默认知识库Debug排查vscode配置launch.json命令行自动启动condadebug知识库搜索测试更换ChineseRecursiveTextSplitter分词器 结论 关于markdownHeaderTextSplitter的探索标准的markdown测试集Langchain区分head1和head…

Linux驱动(2)---Linux内核的组成

1.Linux内核源码目录 arch包含和硬件体系相关结构相关源码,每个平台占用一个目录 block:块设备驱动程序I/O调度 crypto:常用加密和三列算法,还有一些压缩和CRC校验算法。 documentation:内核个部分的通用解释和注释.。 drive…

01_尚硅谷JavaWeb最新版笔记

尚硅谷JAVAWEB概述 课程概述 计划学习时间:1周以内