我是靠谱客的博主 踏实短靴,最近开发中收集的这篇文章主要介绍【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

最后

以上就是踏实短靴为你收集整理的【ClickHouse内核】MergeTree分区目录合并详细过程数据分区目录命名规则分区目录合并过程描述通过系统表查看分区状态修改无效分区目录删除时间的全部内容,希望文章能够帮你解决【ClickHouse内核】MergeTree分区目录合并详细过程数据分区目录命名规则分区目录合并过程描述通过系统表查看分区状态修改无效分区目录删除时间所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部