大数据技术学习——ClickHouse
【摘要】 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 Indexes:CK主键索引文件比较简单,仅仅记录每个Granule的首行主键,它需要联合Mark文件才能定位到具体数据。MergeTree引擎的表主键可以重复,也可采用其他引擎去重。
- Skipping Indexes:跳数索引,本质是一个Granule的统计值(例如minmax),有助于where筛选时跳过大量不必要数据。
- Block:CK列存文件单元,每个列存文件(.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:跳数索引,存储分区内每个Granule的minmax等统计值
4.3 分布式表
ClickHouse支持单机模式,也支持分布式模式。联合Distributed引擎及ZooKeeper可提供复制表以及分布式表的能力。
- 集群中每一个分片(shard)对应一台服务器,分片可线性扩展。同一分片内可按需配置副本。
- 分片内可创建本地表,只在当前节点可见。本地表可进一步划分成多个分区。
- 分布式表本身不存储数据,由各节点上本地表映射而来。负责将请求转发给本地表。
5 索引流程
- 根据主键查找idx找到下标(mark),再根据下标与id.mrk2联结找到数据存储的Block及Block内Granule的位置
6 参考
- https://blog.csdn.net/coolwriter/article/details/80346454
- http://www.clickhouse.com.cn/topic/5ffec51eba8f16b55dd0ffe4
- https://clickhouse.tech/docs/zh/
- https://developer.aliyun.com/article/762092
- https://schnappi618.github.io/archives/
- https://zhuanlan.zhihu.com/p/98135840
- https://zhuanlan.zhihu.com/p/143708307
- https://bbs.huaweicloud.com/forum/thread-82963-1-1.html
- https://developer.aliyun.com/article/762090
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)