李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
【转载】04.ClickHouse表引擎之Log系列表引擎
Leefs
2022-04-29 AM
1900℃
0条
[TOC] ### 前言 本篇文章转载于大佬文章:[大数据技术与数仓](https://www.modb.pro/db/79081) ### 一、概述 本文将介绍ClickHouse中一个非常重要的概念—**表引擎(table engine)**。 如果对MySQL熟悉的话,或许你应该听说过InnoDB和MyISAM存储引擎。 不同的存储引擎提供不同的存储机制、索引方式、锁定水平等功能,也可以称之为**表类型**。 ClickHouse提供了丰富的表引擎,这些不同的表引擎也代表着不同的**表类型**。 比如数据表拥有何种特性、数据以何种形式被存储以及如何被加载。 本文会对ClickHouse中常见的表引擎进行介绍,主要包括以下内容: - 表引擎的作用是什么 - MergeTree系列引擎 - Log家族系列引擎 - 外部集成表引擎 - 其他特殊的表引擎 ### 二、表引擎的作用是什么 - 决定表存储在哪里以及以何种方式存储 - 支持哪些查询以及如何支持 - 并发数据访问 - 索引的使用 - 是否可以执行多线程请求 - 数据复制参数 ### 三、表引擎分类 | 引擎分类 | 引擎名称 | | ------------------- | ------------------------------------------------------------ | | MergeTree系列 | MergeTree 、ReplacingMergeTree 、SummingMergeTree 、 AggregatingMergeTree 、 CollapsingMergeTree 、 VersionedCollapsingMergeTree 、GraphiteMergeTree | | Log系列 | TinyLog 、StripeLog 、Log | | Integration Engines | Kafka 、MySQL、ODBC 、JDBC、HDFS | | Special Engines | Distributed 、MaterializedView、 Dictionary 、Merge 、File、Null 、Set 、Join 、 URL View、Memory 、 Buffer | ### 四、Log系列表引擎 #### 4.1 应用场景 Log系列表引擎功能相对简单,主要用于快速写入小表(1百万行左右的表),然后全部读出的场景。**即一次写入多次查询**。 #### 4.2 Log系列表引擎的特点 ##### 共性特点 - 数据存储在磁盘上 - 当写数据时,将数据追加到文件的末尾 - 不支持**并发读写**,当向表中写入数据时,针对这张表的查询会被阻塞,直至写入动作结束 - 不支持索引 - 不支持原子写:如果某些操作(异常的服务器关闭)中断了写操作,则可能会获得带有损坏数据的表 - 不支持**ALTER操作**(这些操作会修改表设置或数据,比如delete、update等等) #### 4.3 区别 + **TinyLog** TinyLog是Log系列引擎中功能简单、性能较低的引擎。它的存储结构由数据文件和元数据两部分组成。其中,**数据文件是按列独立存储的,也就是说每一个列字段都对应一个文件**。除此之外,TinyLog不支持并发数据读取。 + **StripLog** 支持并发读取数据文件,当读取数据时,ClickHouse会使用多线程进行读取,每个线程处理一个单独的数据块。另外,**StripLog将所有列数据存储在同一个文件中**,减少了文件的使用数量。 + **Log** 支持并发读取数据文件,当读取数据时,ClickHouse会使用多线程进行读取,每个线程处理一个单独的数据块。**Log引擎会将每个列数据单独存储在一个独立文件中**。 #### 4.4 TinyLog表引擎使用 该引擎适用于**一次写入,多次读取的场景**。对于处理小批数据的中间表可以使用该引擎。值得注意的是,使用大量的小表存储数据,性能会很低。 ```sql CREATE TABLE emp_tinylog ( emp_id UInt16 COMMENT '员工id', name String COMMENT '员工姓名', work_place String COMMENT '工作地点', age UInt8 COMMENT '员工年龄', depart String COMMENT '部门', salary Decimal32(2) COMMENT '工资' )ENGINE=TinyLog(); INSERT INTO emp_tinylog VALUES (1,'tom','上海',25,'技术部',20000),(2,'jack','上海',26,'人事部',10000); INSERT INTO emp_tinylog VALUES (3,'bob','北京',33,'财务部',50000),(4,'tony','杭州',28,'销售事部',50000); ``` 进入默认数据存储目录,查看底层数据存储形式,可以看出:**TinyLog**引擎表每一列都对应的文件 ```sql [root@cdh04 emp_tinylog]# pwd /var/lib/clickhouse/data/default/emp_tinylog [root@cdh04 emp_tinylog]# ll 总用量 28 -rw-r----- 1 clickhouse clickhouse 56 9月 17 14:33 age.bin -rw-r----- 1 clickhouse clickhouse 97 9月 17 14:33 depart.bin -rw-r----- 1 clickhouse clickhouse 60 9月 17 14:33 emp_id.bin -rw-r----- 1 clickhouse clickhouse 70 9月 17 14:33 name.bin -rw-r----- 1 clickhouse clickhouse 68 9月 17 14:33 salary.bin -rw-r----- 1 clickhouse clickhouse 185 9月 17 14:33 sizes.json -rw-r----- 1 clickhouse clickhouse 80 9月 17 14:33 work_place.bin ## 查看sizes.json数据 ## 在sizes.json文件内使用JSON格式记录了每个.bin文件内对应的数据大小的信息 { "yandex":{ "age%2Ebin":{ "size":"56" }, "depart%2Ebin":{ "size":"97" }, "emp_id%2Ebin":{ "size":"60" }, "name%2Ebin":{ "size":"70" }, "salary%2Ebin":{ "size":"68" }, "work_place%2Ebin":{ "size":"80" } } } ``` 当我们执行**ALTER操作**时会报错,说明该表引擎不支持ALTER操作 ```sql -- 以下操作会报错: -- DB::Exception: Mutations are not supported by storage TinyLog. ALTER TABLE emp_tinylog DELETE WHERE emp_id = 5; ALTER TABLE emp_tinylog UPDATE age = 30 WHERE emp_id = 4; ``` #### 4.5 StripLog表引擎使用 相比TinyLog而言,StripeLog拥有更高的查询性能(拥有.mrk标记文件,支持并行查询),同时其使用了更少的文件描述符(所有数据使用同一个文件保存)。 ```sql CREATE TABLE emp_stripelog ( emp_id UInt16 COMMENT '员工id', name String COMMENT '员工姓名', work_place String COMMENT '工作地点', age UInt8 COMMENT '员工年龄', depart String COMMENT '部门', salary Decimal32(2) COMMENT '工资' )ENGINE=StripeLog; -- 插入数据 INSERT INTO emp_stripelog VALUES (1,'tom','上海',25,'技术部',20000),(2,'jack','上海',26,'人事部',10000); INSERT INTO emp_stripelog VALUES (3,'bob','北京',33,'财务部',50000),(4,'tony','杭州',28,'销售事部',50000); -- 查询数据 -- 由于是分两次插入数据,所以查询时会有两个数据块 cdh04 :) select * from emp_stripelog; SELECT * FROM emp_stripelog ┌─emp_id─┬─name─┬─work_place─┬─age─┬─depart─┬───salary─┐ │ 1 │ tom │ 上海 │ 25 │ 技术部 │ 20000.00 │ │ 2 │ jack │ 上海 │ 26 │ 人事部 │ 10000.00 │ └────────┴──────┴────────────┴─────┴────────┴──────────┘ ┌─emp_id─┬─name─┬─work_place─┬─age─┬─depart───┬───salary─┐ │ 3 │ bob │ 北京 │ 33 │ 财务部 │ 50000.00 │ │ 4 │ tony │ 杭州 │ 28 │ 销售事部 │ 50000.00 │ └────────┴──────┴────────────┴─────┴──────────┴──────────┘ ``` 进入默认数据存储目录,查看底层数据存储形式 ```shell [root@cdh04 emp_stripelog]# pwd /var/lib/clickhouse/data/default/emp_stripelog [root@cdh04 emp_stripelog]# ll 总用量 12 -rw-r----- 1 clickhouse clickhouse 673 9月 17 15:11 data.bin -rw-r----- 1 clickhouse clickhouse 281 9月 17 15:11 index.mrk -rw-r----- 1 clickhouse clickhouse 69 9月 17 15:11 sizes.json ``` 可以看出StripeLog表引擎对应的存储结构包括三个文件: - **data.bin**:数据文件,所有的列字段使用同一个文件保存,它们的数据都会被写入data.bin。 - **index.mrk**:数据标记,保存了数据在data.bin文件中的位置信息(每个插入数据块对应列的offset),利用数据标记能够使用多个线程,以并行的方式读取data.bin内的压缩数据块,从而提升数据查询的性能。 - **sizes.json**:元数据文件,记录了data.bin和index.mrk大小的信息 > 提示: > > + StripeLog引擎将所有数据都存储在了一个文件中,对于每次的**INSERT**操作,ClickHouse会将**数据块**追加到表文件的末尾 > > + StripeLog引擎同样不支持`ALTER UPDATE`和`ALTER DELETE`操作 #### 4.6 Log表引擎使用 Log引擎表适用于临时数据,一次性写入、测试场景。Log引擎结合了TinyLog表引擎和StripeLog表引擎的长处,是Log系列引擎中性能最高的表引擎。 ```sql CREATE TABLE emp_log ( emp_id UInt16 COMMENT '员工id', name String COMMENT '员工姓名', work_place String COMMENT '工作地点', age UInt8 COMMENT '员工年龄', depart String COMMENT '部门', salary Decimal32(2) COMMENT '工资' )ENGINE=Log; INSERT INTO emp_log VALUES (1,'tom','上海',25,'技术部',20000),(2,'jack','上海',26,'人事部',10000); INSERT INTO emp_log VALUES (3,'bob','北京',33,'财务部',50000),(4,'tony','杭州',28,'销售事部',50000); -- 查询数据, -- 由于是分两次插入数据,所以查询时会有两个数据块 cdh04 :) select * from emp_log; SELECT * FROM emp_log ┌─emp_id─┬─name─┬─work_place─┬─age─┬─depart─┬───salary─┐ │ 1 │ tom │ 上海 │ 25 │ 技术部 │ 20000.00 │ │ 2 │ jack │ 上海 │ 26 │ 人事部 │ 10000.00 │ └────────┴──────┴────────────┴─────┴────────┴──────────┘ ┌─emp_id─┬─name─┬─work_place─┬─age─┬─depart───┬───salary─┐ │ 3 │ bob │ 北京 │ 33 │ 财务部 │ 50000.00 │ │ 4 │ tony │ 杭州 │ 28 │ 销售事部 │ 50000.00 │ └────────┴──────┴────────────┴─────┴──────────┴──────────┘ ``` 进入默认数据存储目录,查看底层数据存储形式 ```shell [root@cdh04 emp_log]# pwd /var/lib/clickhouse/data/default/emp_log [root@cdh04 emp_log]# ll 总用量 32 -rw-r----- 1 clickhouse clickhouse 56 9月 17 15:55 age.bin -rw-r----- 1 clickhouse clickhouse 97 9月 17 15:55 depart.bin -rw-r----- 1 clickhouse clickhouse 60 9月 17 15:55 emp_id.bin -rw-r----- 1 clickhouse clickhouse 192 9月 17 15:55 __marks.mrk -rw-r----- 1 clickhouse clickhouse 70 9月 17 15:55 name.bin -rw-r----- 1 clickhouse clickhouse 68 9月 17 15:55 salary.bin -rw-r----- 1 clickhouse clickhouse 216 9月 17 15:55 sizes.json -rw-r----- 1 clickhouse clickhouse 80 9月 17 15:55 work_place.bin ``` Log引擎的存储结构包含三部分: - **列.bin**:数据文件,数据文件按列单独存储 - **__marks.mrk**:数据标记,统一保存了数据在各个.bin文件中的位置信息。利用数据标记能够使用多个线程,以并行的方式读取。.bin内的压缩数据块,从而提升数据查询的性能。 - **sizes.json**:记录了.bin和__marks.mrk大小的信息 > 提示: > > Log表引擎会将每一列都存在一个文件中,对于每一次的INSERT操作,都会对应一个数据块
标签:
ClickHouse
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/2033.html
上一篇
【转载】03.ClickHouse数据类型
下一篇
【转载】05.ClickHouse表引擎之MergeTree系列引擎
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
HDFS
Tomcat
ClickHouse
Python
锁
人工智能
CentOS
pytorch
Redis
Flink
BurpSuite
Java
Azkaban
NIO
数据结构
栈
MyBatis-Plus
Sentinel
MySQL
Kibana
哈希表
SQL练习题
Hadoop
JavaSE
Kafka
RSA加解密
Java阻塞队列
Golang
ajax
Java编程思想
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭