李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
【转载】04.ClickHouse表引擎之Log系列表引擎
Leefs
2022-04-29 AM
1299℃
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
标签云
Git
数据结构
JVM
Kafka
Quartz
Redis
Spark SQL
FileBeat
Spark RDD
稀疏数组
Elastisearch
MyBatisX
VUE
Yarn
容器深入研究
ajax
并发编程
前端
Map
持有对象
人工智能
HDFS
Zookeeper
线程池
Typora
Java编程思想
哈希表
Tomcat
并发线程
排序
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞