【ClickHouse内核】MergeTree分区目录合并详细过程

目录

数据分区目录命名规则

分区目录合并过程描述

通过系统表查看分区状态

修改无效分区目录删除时间


数据分区目录命名规则

MergeTree数据分区目录命名规则 其规则为

PartitionID_MinBlockNum_MaxBlockNum_Level

比如10_2_2_0

其中 10 是分区ID ,2_2对应的是最小的数据块编号和最大的数据块编号,最后的 _0 表示目前分区合并的层级。这么命名是为了数据目录合并算法。之后的文章会进行说明。

PartitionID:该值由 insert 数据时分区键的值来决定。分区键支持使用任何一个或者多个字段组合表达式,针对取值数据类型的不同,分区ID的生成逻辑目前有四种规则:

  • 不指定分区键:如果建表时未指定分区键,则分区ID默认使用all,所有数据都被写入all分区中。
  • 整型字段:如果分区键取值是整型字段,并且无法转换为YYYYMMDD的格式,则会按照该整型字段的字符形式输出,作为分区ID取值。
  • 日期类型:如果分区键属于日期格式,或可以转换为YYYYMMDD格式的整型,则按照YYYYMMDD格式化后的字符形式输出,作为分区ID取值。
  • 其他类型:如果使用其他类似Float、String等类型作为分区键,会通过对其插入数据的128位Hash值作为分区ID的取值。

MinBlockNum 和 MaxBlockNum: BlockNum 是一个整型的自增长型编号,该编号在单张MergeTree表中从1开始全局累加,当有新的分区目录创建后,该值就加1,对新的分区目录来讲,MinBlockNum 和 MaxBlockNum 取值相同。

Level: 表示合并的层级。相当于某个分区被合并的次数,它不是以表全局累加,而是以分区为单位,初始创建的分区,初始值为0,相同分区ID发生合并动作时,在相应分区内累计加1。

 

分区目录合并过程描述

创建表测试

创建MergeTree表引擎的SQL如下所示:

CREATE TABLE partition_directory_merge(    partition_key Int32,    orderBy_key String,    data String)ENGINE = MergeTree()PARTITION BY partition_keyORDER BY orderBy_keySETTINGS min_rows_for_wide_part = 0, min_bytes_for_wide_part = 0

通过上图可知,新创建的表是不存在任何的分区目录的。

 

插入数据测试

插入数据的SQL如下所示

insert into partition_directory_merge values(1, '001', 'Value');

通过上图可知,当我们插入分区键为1的数据的时候,底层存储会创建一个1_1_1_0 的分区目录来存放这笔数据。

 

insert into partition_directory_merge values(1, '002', 'Value2');

通过上图可知,当我们插入分区键为1的数据的时候,底层存储还会创建一个 1_2_2_0 的分区目录来存放这笔数据。

 

insert into partition_directory_merge values(1, '003', 'Value3');

通过上图可知,当我们插入分区键为1的数据的时候,底层存储还会创建一个 1_3_3_0 的分区目录来存放这笔数据。

 

目前我们产生了三个分区数据目录,我们强制进行表合并操作

optimize table partition_directory_merge

通过上图可知,我们强制触发表合并后生成了一个新的分区数据目录 1_1_3_1 

 

如果这时我们再次插入数据呢?

insert into partition_directory_merge values(1, '004', 'Value4');

通过上图可知,当我们插入分区键为1的数据的时候,底层存储还会创建一个 1_4_4_0 的分区目录来存放这笔数据。

 

我们强制进行表合并操作

optimize table partition_directory_merge

 

分区目录的合并过程逻辑归纳总结

  • MergeTree的分区目录是在数据写入过程中被创建的。也就是一张新建的表,如果没有任何数据,那么也不会有任何的分区存在。
  • MergeTree的分区目录伴随着每一批数据的写入(一次insert语句),mergetree都会生成一批新的分区目录,即便不同批次写入的数据属于相同分区,也会生成不同的分区目录。
  • 每次insert都会产生一个分区,那么就存在多个相同分区的情况,clickhouse会通过后台任务再将相同分区的多个目录合并成一个新的目录。已经存在的旧目录并不会立即被删除,而是在之后的某个时刻通过后台被删除。
  • 同属于一个分区的多个目录,在合并之后会形成一个全新的目录,目录中的索引和数据文件也会相应的进行合并。新目录名称的合并规则如下:
  • MinBlockNum: 取同一分区内所有目录中最小的MinBlockNum值。
  • MaxBlockNum: 取同一分区内所有目录中最大的MaxBlockNum值。
  • Level: 取同一分区内最大Level值并加1。

 

通过系统表查看分区状态

通过系统表查询分区状态的SQL如下所示:

SELECT    partition,    name,    part_type,    activeFROM system.partsWHERE table = 'partition_directory_merge'

 

系统表属性解析如下:

  • partition 列存储分区的名称。此示例中有1个分区:1
  • name 列为分区目录的名称。
  • part_type 数据存储格式。Wide: 每一列都单独存储一个数据文件;Compact: 所有列都存储一个数据文件。
  • active 列为片段状态。1 代表激活状态;0 代表非激活状态。非激活片段是那些在合并到较大片段之后剩余的源数据片段。损坏的数据片段也表示为非活动状态。

 

修改无效分区目录删除时间

ClickHouse合并完分区数据目录后,老的数据目录不会立刻删除。会等待8分钟之后才会删除。如下所示

 

但是有些特殊场景下,用户希望立刻删除老的数据目录,这种需求可以在创建MergeTree表的时候通过Settings属性来设置。如下所示

CREATE TABLE partition_directory_merge(    partition_key Int32,    orderBy_key String,    data String)ENGINE = MergeTree()PARTITION BY partition_keyORDER BY orderBy_keySETTINGS old_parts_lifetime = 1
  • old_parts_lifetime 这个属性的含义是多久删除老的分区数据目录。单位是秒
分享大数据行业的一些前沿技术和手撕一些开源库的源代码
微信公众号名称:技术茶馆
微信公众号ID    :    Night_ZW
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《深入理解Linux内核》是一本非常重要的书籍,它带有目录,便于读者快速查找和理解书中的内容。 在这本书中,作者主要通过对Linux内核的源代码进行分析和解读,帮助读者深入理解Linux内核的运行原理和机制。这本书的目录设计非常合理,分为多个章节,涵盖了诸多主题。 在第一章,作者介绍了Linux内核的体系结构和主要组成部分。第二章到第五章,作者详细讲解了Linux内核的进程管理、内存管理、文件系统和输入输出子系统。这些章节帮助读者了解Linux内核各个方面的工作原理和实现细节。 在第六章和第七章,作者介绍了Linux内核的设备驱动和网络子系统。这些章节解释了如何编写设备驱动程序和网络协议栈,以及如何在内核中管理和控制硬件设备和网络通信。 在第八章和第九章,作者讲解了Linux内核的调试和性能优化技术。这些章节提供了一些实用的工具和方法,帮助读者定位和解决内核中的bug,并对系统进行性能分析和优化。 第十章和第十一章分别介绍了系统调用接口和内核模块的开发。这些章节详细阐述了如何使用系统调用与用户空间进行交互,以及如何编写内核模块扩展Linux内核的功能。 在最后一章,作者提供了一些关于内核开发和贡献的建议,帮助读者更好地参与到Linux社区中。 通过这本书的阅读和理解,读者可以深入了解Linux内核的工作原理和设计思想,对于从事Linux系统开发、驱动程序开发等方面的工作非常有帮助。带有目录的这本书方便读者查找和回顾相关内容,是理解Linux内核的重要参考资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值