大数据技术学习——ClickHouse

举报
slx_share 发表于 2023/03/02 11:22:16 2023/03/02
【摘要】 ClickHouse(CK)是面向OLAP的列式数据库。

1       一句话介绍

ClickHouse(CK)是面向OLAP的列式数据库。

2       基本概念

  • 存储引擎(表引擎):决定数据往操作系统层面文件系统读写、更新、删除方式的技术,各种技术提供不同的存储机制、索引技巧及其他辅助功能。CK提供了多种存储引擎,最常用的是MergeTree系列引擎。
  • 索引:数据库系统中维护满足特定查找算法的额外文件,通常文件存储指向数据位置的指针。传统关系型数据库多采用B树建立索引文件。索引文件需要占用磁盘空间,且插入数据后索引需要重构(B树平衡过程),因此写性能会降低。B树索引示例如下:


注意,NoSQL数据库采用的LSM树并非数据结构,而是存储结构。

  • Granule:颗粒度,将大表切分后的逻辑单元,由参数index_granularity(每单元固定行数,默认8192)index_granularity_bytes (每单元固定字节数,默认10Mb)确定。一个Granule是不可分割的数据集合,是CK读取数据到内存中的基本单位,从而避免因读取一行数据即将整个bin文件放入内存中造成巨大IO、内存开销。
  • 联合主键:多个字段组合成的主键。用于进一步确定主键的唯一性。
  • Primary IndexesCK主键索引文件比较简单,仅仅记录每个Granule的首行主键,它需要联合Mark文件才能定位到具体数据。MergeTree引擎的表主键可以重复,也可采用其他引擎去重。
  • Skipping Indexes:跳数索引,本质是一个Granule的统计值(例如minmax),有助于where筛选时跳过大量不必要数据。
  • BlockCK列存文件单元,每个列存文件(.bin)由一个或多个Block组成。内存中Granule数量达到一定程度后即落盘成Block
  • Data Part:每次批量插入的数据都会生成一个Data Part,并且会被分配一个BlockNumber(相当于此批数据的版本号)。

3       OLAP场景特点

  • 读多于写

数据往往批量导入,吞吐率要求高,较少更新删除,但需从不同维度灵活地、反复地抽取数据进行试错分析。

  • 宽表、读大量行少量列

一次数据分析所需的维度(列)较少,但往往需对一列全部数据进行聚合计算,产生的结果集也较少。

  • 无需事务、一致性要求较低

通常是导入历史日志数据,或搭配事务型数据库并实时从事务型数据库中进行数据同步。

  • 灵活多变、不适合预先建模

数据分析场景下,需要随着业务变化及时调整分析维度及指标等,而且数据量大,调整代价高。预先建模不适应快速变化,维护成本高。

4       ClickHouse数据结构

4.1       逻辑结构

ClickHouse创建表时必须指定引擎。

  • 由按主键排序Data Part组成。
  • 表可自定义分区键进行分区(Partition),分区间逻辑隔离。
  • 同一分区下BlockNumber区间相邻的若干个Data Part会自动或手动合并。


4.2       物理结构

一张表完整的物理结构包括表目录、分区目录及数据文件组成。数据文件如下:

  • txt:校验文件完整性和准确性
  • txt:存储表的列字段信息(字段名称、字段类型)
  • txt:存储当前分区目录下数据行数
  • idx:一级索引文件,仅存储主键
  • <col name>.bin:列存压缩文件,存放某列的数据
  • <col name>.mrk/<col name>.mrk2:列字段标记文件,记录Granule行数,相应Block在列存压缩文件中的偏移量,Granule在解压后的Block中的偏移量。如果使用了自适应大小的索引间隔,会以.mrk2命名。

  • <minmax>.idx:跳数索引,存储分区内每个Granuleminmax等统计值


4.3       分布式表

ClickHouse支持单机模式,也支持分布式模式。联合Distributed引擎及ZooKeeper可提供复制表以及分布式表的能力。

  • 集群中每一个分片(shard)对应一台服务器,分片可线性扩展。同一分片内可按需配置副本。
  • 分片内可创建本地表,只在当前节点可见。本地表可进一步划分成多个分区。
  • 分布式表本身不存储数据,由各节点上本地表映射而来。负责将请求转发给本地表。

5       索引流程


  • 根据主键查找idx找到下标(mark),再根据下标与id.mrk2联结找到数据存储的BlockBlockGranule的位置

6       参考

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。