Clickhouse 数据存储

这篇具有很好参考价值的文章主要介绍了Clickhouse 数据存储。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、数据分区

        数据是以分区目录的形式组织的,每个分区独立分开存储.这种形式,查询数据时,可以有效的跳过无用的数据文件。

1.1 数据分区的规则

        分区键的取值,生成分区ID,分区根据ID决定。根据分区键的数据类型不同,分区ID的生成目前有四种规则:
(1)不指定分区键
(2)整形
(3)日期类型(主要根据日期进行分区)
(4)其他类型
数据在写入时,会对照分区ID落入对应的分区

1.2分区目录的生成规则

        partitionID_MinBlockNum_MaxBlockNum_Level
BlockNum是一个全局整型,从1开始,每当新创建一个分区目录,此数字就累加1。

MinBlockNum:最小数据块编号。
MaxBlockNum:最大数据块编号。

对于一个新的分区,MinBlockNum和MaxBlockNum的值相同: 2020_03_1_1_0,2020_03_2_2_0
*Level:合并的层级,即某个分区被合并过得次数。不是全局的,而是针对某一个分区。

1.3分区目录的合并过程

MergeTree的分区目录在数据写入过程中被创建。
不同的批次写入数据属于同一分区,也会生成不同的目录,在之后的某个时刻再合并(写入后的10-15分钟),合并后的旧分区目录默认8分钟后删除。
同一个分区的多个目录合并以后的命名规则:
。MinBlockNum: 取同一分区中MinBlockNum值最小的
。MaxBlockNum:取同一分区中MaxBlockNum值最大的
·Level:取同一分区最大的Level值加1

二、索引文件

2.1 稀疏索引

        primary.idx文件的一级索引采用稀疏索引。
        稠密索引: 每一行索引标记对应一行具体的数据记录。

        稀疏索引:每一行索引标记对应一段数据记录(默认索引粒度为8192)。

Clickhouse 数据存储,clickhouse,linux,大数据

 稀疏索引占用空间小,所以primary.idx内的索引数据常驻内存,取用速度快!

2.2 一级索引

文件:primary.idx
MergeTree的主键使用Primary Key定义,主键定义之后,MergeTree会根据index granularity间隔(默认8192)为数据生成一级索引并保存至primaryidx文件中。这种方式是稀疏索引

        **简化形式:通过order by指代主键**

2.3索引生成规则

Clickhouse 数据存储,clickhouse,linux,大数据

三、 索引如何执行查询操作

索引的查询过程
索引是如何工作的?对primaryidx文件的查询过程**MarkRange:一小段数据区间**按照index granularity的间隔粒度,将一段完整的数据划分成多个小的数据段,小的数据段就是MarkRangeMarkRange与索引编号对应
案例
共200行数据
indexgranularity大小为5
主键ID为Int,取值从0开始
根据索引生成规则,primary.idx文件内容为:

Clickhouse 数据存储,clickhouse,linux,大数据

 执行过程

Clickhouse 数据存储,clickhouse,linux,大数据

        Clickhouse 数据存储,clickhouse,linux,大数据

.bin 原始数据 .mark 索引映射 

Clickhouse 数据存储,clickhouse,linux,大数据

 形成一个压缩块Clickhouse 数据存储,clickhouse,linux,大数据

 整体数据查询过程

Clickhouse 数据存储,clickhouse,linux,大数据

Clickhouse 数据存储,clickhouse,linux,大数据

 Clickhouse 数据存储,clickhouse,linux,大数据

.bin文件形成多个压缩块->.mark文件找到压缩块 ->索引块->解压->再找数据

Clickhouse 数据存储,clickhouse,linux,大数据

数据写入过程

Clickhouse 数据存储,clickhouse,linux,大数据

 查询过程

Clickhouse 数据存储,clickhouse,linux,大数据

Clickhouse 数据存储,clickhouse,linux,大数据

四、 二进制文件解释

二进制文件格式详解
在介绍了上述目录下的每个文件的功能和作用后,我们一起来看看上面各项文件中,具体存储了什么信息,以及如何去分析这些二进制文件。

在讲解之前,为了更好的看清文件内容,我们一共在users表中插入5条数据:

insert into test.users values ('zhangsan', 'female', 20, '2023-03-07');
insert into test.users values ('lisi', 'female', 22, '2023-03-06');
insert into test.users values ('lilei', 'female', 25, '2023-03-06');
insert into test.users values ('xiaoming', 'female', 27, '2023-03-09');
insert into test.users values ('yaya', 'female', 30, '2023-03-07');

SELECT * FROM users ORDER BY age DESC

Query id: ee21ad84-be21-47cf-92bd-55059d59fa6e

┌─name─┬─sex────┬─age─┬───birthday─┐
│ yaya │ female │  30 │ 2023-03-07 │
└──────┴────────┴─────┴────────────┘
┌─name─────┬─sex────┬─age─┬───birthday─┐
│ xiaoming │ female │  27 │ 2023-03-09 │
│ lilei    │ female │  25 │ 2023-03-06 │
│ lisi     │ female │  22 │ 2023-03-06 │
│ zhangsan │ female │  20 │ 2023-03-07 │
└──────────┴────────┴─────┴────────────┘

5 rows in set. Elapsed: 0.002 sec. 

primary.idx
MergeTree表会根据排序键生成primary.idx表,由users的建表语句可知,我们设置排序的键为age,同时index_granularity = 2。因此对应primary.idx中生成的记录应该为20、25、30三条记录。接下来,我们进入到primary.idx文件中,看下记录的内容是不是我们逻辑上分析的结果:

hexdump -C primary.idx
00000000  14 19 1e 1e                                       |....|
00000004

hexdump可以用来查看二进制文件的十六进制编码。由于定义的age Int8占用1个字节,因此上面的每一个16进制值应该对应于一个Age值。 对上面的十六进制结果做一下转换:

14(十六进制)->20(十进制)
19(十六进制)->25(十进制)
1e(十六进制)->30(十进制)
可以发现,转换成10进制后跟我们一开始的逻辑分析结果一致。证明了我们的猜想,更进一步核实了Clickhouse中primary.idx稀疏索引的原理。

{column}.mrk2

一个{column}.bin文件有1至多个数据压缩块组成,mark2数据标记文件格式比较固定,primary.idx文件中的每个索引在此文件中都有一个对应的Mark,有三列:
Offset in compressed file,8 Bytes,代表该标记指向的压缩数据块在bin文件中的偏移量
Offset in decompressed block,8 Bytes,代表该标记指向的数据在解压数据块中的偏移量
Rows count,8 Bytes,行数,通常情况下其等于index_granularity

Clickhouse 数据存储,clickhouse,linux,大数据
因此,每一行mrk2文件共占用24 Bytes。所以通过primary.idx中的索引寻找mrk2文件中对应的Mark非常简单,如果要寻找第n(从0开始)个index,则对应的Mark在mrk2文件中的偏移为n*24,从这个偏移处开始读取24 Bytes即可得到相应的Mark。

age.mrk2

$ hexdump -C age.mrk2
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000010  02 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  02 00 00 00 00 00 00 00  02 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  04 00 00 00 00 00 00 00  |................|
00000040  01 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000050  05 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000060

$ od -An -l age.mrk2
                    0                    0
                    2                    0
                    2                    2
                    0                    4
                    1                    0
                    5                    0

分析下上面的文件内容。由于24 Bytes表示一行数据,因此从上面以每24位做切分,可以得到如下所示的表:

Clickhouse 数据存储,clickhouse,linux,大数据

由于最后一个mark对应的数据只有一条,所以最后一个行数为1。从表中可以看出,解压文件中的偏移量对应的原表中的age值这与我们在primary.idx中分析出来的3个索引值一一对应。
index_granularity =2,且定义的age Int8占用1个字节,所以每两行对应一个索引,mrk2中也是没两行生成一条对应mark。
由于本次存储的数据 < 默认的压缩大小块64KB,因此所有的数据都在一个压缩块内,压缩文件中的偏移量都是0。
由于最后一个mark对应的数据只有一条,所以最后一个行数为1。文章来源地址https://www.toymoban.com/news/detail-634954.html

到了这里,关于Clickhouse 数据存储的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ClickHouse列存储(十一)—— ClickHouse

    1.数据库基本概念 2.列式存储 3.clickHouse存储设计 4.clickHouse典型应用场景 1、了解数据库基本概念 数据库 DBMS:数据库管理系统 OLTP 数据库 : OLTP(Online transactional processing) OLAP 数据库:OLAP (Online analytical processing) SQL (Structured Query Language) 词法分析 语法分析 AST (Abstract syntax t

    2024年02月10日
    浏览(43)
  • Clickhouse 存储引擎

            这个引擎是在 MergeTree 的基础上,添加了”处理重复数据”的功能,该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项。 特点: 1使用ORDERBY排序键作为判断重复的唯一键 2.数据的去重只会在合并的过程中触发 3.以数据分区为单位删除重复数据,不同分

    2024年02月14日
    浏览(74)
  • 一百四十七、Kettle——Linux上安装的kettle8.2连接ClickHouse数据库

    kettle8.2在Linux安装好后,需要与ClickHouse数据库建立连接 https://pan.baidu.com/s/1iqGyXsTaQSCHEbjj7yX7AA 提取码: mvzd   注意 : clickhouse-plugins文件里就是自定义的驱动jar包 注意: 要知道Linux系统架构是64位还是32位, 它们所属的Linux文件夹不同 到这里,Linux安装的kettle8.2就可以与ClickHou

    2024年02月13日
    浏览(66)
  • 结合云计算的最新技术和现状,介绍云计算基础知识、开源分布式数据库Clickhouse、可视化数据分析工具、分布式链路跟踪系统Pinpoint、数据湖存储系统Pulsar等

    作者:禅与计算机程序设计艺术 2019年,“云计算”将成为“经济全球化”的热门词汇之一,2020年全球云计算市场规模预计达到1万亿美元。中国是继美国、英国之后,成为全球第四大云服务提供商。华为、腾讯、阿里巴巴等互联网巨头纷纷布局云计算领域,各家公司纷纷推出

    2024年02月08日
    浏览(56)
  • 一百五十六、Kettle——Linux上安装的Kettle9.3连接ClickHouse数据库(亲测,附流程截图)

    kettle9.3在Linux上安装好后,需要与ClickHouse数据库建立连接 1、kettle版本是9.3 2、ClickHouse版本是21.9.5.16   https://pan.baidu.com/s/1iqGyXsTaQSCHEbjj7yX7AA 提取码: mvzd 注意 : clickhouse-plugins文件里就是自定义的clickhouse驱动jar包    注意 : 要区分Linux系统架构是64位还是32位, 它们所属的L

    2024年02月12日
    浏览(63)
  • 【clickhouse】ClickHouse与MySQL之间实时同步数据(MySQL引擎),将MySQL数据实时同步到clickhouse

    参考1:MySQL(通过该配置实现了实时同步) 参考2:experimental MaterializedMySQL 参考3:[experimental] MaterializedMySQL(包含设置 allow_experimental_database_materialized_mysql) MySQL引擎用于将远程的MySQL服务器中的表映射到ClickHouse中,并允许您对表进行INSERT和SELECT查询,以方便您在ClickHouse与MySQL之间进行

    2024年01月16日
    浏览(44)
  • 【Flink】【ClickHouse】写入流式数据到ClickHouse

    Flink 安装的教程就不在这里赘叙了,可以看一下以前的文章,这篇文章主要是把流式数据写入的OLAP(ClickHouse)中作查询分析 Flink 1.13.2, ClickHouse 22.1.3.7 这里直接使用docker安装,没有安装的同学可以使用homebreak来安装,执行下面的命令即可( 已经安装了docker的可以忽略 ) 四指

    2024年02月03日
    浏览(44)
  • ClickHouse进阶(七):Clickhouse数据查询-1

    进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 📌订阅:拥抱独家专题,你的订阅将点燃我的创作热情! 👍点赞:赞同优秀创作,你

    2024年02月10日
    浏览(48)
  • clickhouse系列3:clickhouse分析英国房产价格数据

     本文使用的数据集下载链接: https://download.csdn.net/download/shangjg03/88478086 该数据集包含有关英格兰和威尔士自1995年起到2023年的房地产价格的数据,超过2800万条记录,未压缩形式的数据集大小超过4GB,在ClickHouse中需要约306MB。

    2024年02月10日
    浏览(33)
  • 大数据系列——什么是ClickHouse?ClickHouse有什么用途?

    目录 一、什么是ClickHouse 二、ClickHouse有什么用途 三、ClickHouse的不足 四、适用场景 五、ClickHouse特点 六、ClickHouse VS MySQL 七、类SQL 语句  八、核心概念 clickHouse是俄罗斯的 Yandex 公司于 2016 年开源的 列式存储数据库, 使用 C++ 语言编写; 一款面向 OLAP 的数据库 ClickHouse支持类

    2024年01月22日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包