《ClickHouse原理解析与应⽤实践》读书笔记
第1章 ClickHouse的前世今⽣
开篇提到了Google开启⼤数据处理时代的三篇论⽂“Google File System”、“Google MapReduce”和“Google Bigtable”,号称三驾马车。后来⼀度Hadoop成为⼤数据处理的代名词,只要谈到⼤数据处理,没有⽤到Hadoop就认为不属于⼤数据处理⼀样,虽然Hadoop⽣态化的属性带来了很多便利,⽣态内部的组件不需要重复造轮⼦,只需要相互借⼒、组合就能形成新的⽅案。但是⽣态化的另⼀⾯就是臃肿和复杂,维护成本越来越⾼,Hadoop在海量数据和⾼时效性的双重压⼒下,显得⼒不从⼼了。
在OLAP领域,常见的架构分为三类:
(1)ROLAP(Relation OLAP,关系型OLAP),直接使⽤关系模型构建,数据模型使⽤星型模型或者雪花模型;
(2)MOLAP(Multidimensional OLAP,多维型OLAP),使⽤多维数组的形式保存数据,核⼼思想是借助预先聚合的结果,使⽤空间换取时间的形式最终提升查询性能。
(3)HOLAP(Hybrid OLAP,混合架构的OLAP)
ClickHouse名称的含义:
ClickHouse=Click Stream+Data WareHouse
第2章 ClickHouse架构概述
2.1 ClickHouse的核⼼特性
(1)完备的DBMS功能,⽀持DDL、DML、权限控制、数据备份与恢复、分布式管理
(2)列式存储与数据压缩,默认使⽤LZ4算法压缩
(3)向量化执⾏引擎,为了实现向量化执⾏,需要利⽤CPU的SIMD指令,SIMD的全称是Single Instruction Multiple Data,即单条指令操作多条数据,原理是在CPU寄存器层⾯实现数据的并⾏操作。⽬前利⽤SSE4.2指令集实现向量化执⾏。
(4)关系模型与SQL查询,⼤⼩写敏感
(5)多样化的表引擎,拥有合并树、内存、⽂件、接⼝和其他6⼤类20多种表引擎
(6)多线程与分布式,计算移动⽐数据移动更加划算,⽀持分区(纵向扩展,利⽤多线程原理)和分
⽚(横向扩展,利⽤分布式原理)
(7)多主架构,每个节点⾓⾊对等
(8)在线查询
(9)数据分⽚与分布式查询,数据分⽚是将数据进⾏横向切分,⼀种⾯向海量数据的场景下,解决存储和查询瓶颈的有效⼿段,是⼀种分治思想的体现。ClickHouse提供了本地表(Local Table)与分布式表(Distributed Table)的概念。⼀张本地表等同于⼀份数据的分⽚。⽽分布式表本⾝不存储任何数据,它是本地表的访问代理,其作⽤类似于分库中间件,借助分布式表,能够代理访问多个数据分⽚,从⽽实现分布式查询。
2.2 ClickHouse的架构设计
(1)Column与Field,内存中的⼀列数据由⼀个Column对象表⽰。如果需要操作单个具体的值,则需要使⽤Field对象,Field对象代表⼀个单值
(2)DataType,数据的序列化和反序列⼯作由DataType负责
(3)Block与Block流,ClickHouse内部的数据操作是⾯向Block对象进⾏的,并且采⽤了流的形式,B
lock对象可以看作数据表的⼦集。Block对象的本质是由数据对象、数据类型和列名称组成的三元组,即Column、DataType及列名称字符串。流操作有两组顶层接⼝:IBlockInputStream负责数据的读取和关系运算,IBlockOutputStream负责将数据输出到下⼀个环节。
(4)Table,在数据表的底层设计中并没有所谓的Table对象,它直接使⽤IStorage接⼝指代数据表。在数据查询时,IStorage负责根据AST 查询语句的指⽰要求,返回指定列的原始数据,之后再将数据交由Interpreter做进⼀步处理。
(5)Parser与Interpreter,Parser分析器负责创建AST对象,⽽Interpreter解释器则负责解释AST,并进⼀步创建查询的执⾏管道,他们与IStorage⼀起,串联起整个数据查询的过程
安卓在线解析json
(6)Functions与Aggregate Functions,普通函数由IFunction接⼝定义,在函数具体执⾏过程中,并不会⼀⾏⼀⾏地运算,⽽是采⽤向量化的⽅式直接作⽤于⼀整列数据。聚合函数由IAggregateFunction接⼝定义,相⽐⽆状态的普通函数,聚合函数是有状态的,聚合函数的状态⽀持序列化与反序列化,所以能够在分布式节点之间进⾏传输,以实现增量计算。
(7)Cluster与Replication,ClickHouse的1个节点只能拥有1个分⽚,也就是说如果要实现1分⽚、1副本,则⾄少需要部署2个服务节点。分⽚只是⼀个逻辑概念,其物理承载还是由副本承担的。
2.3 Clickhouse为何如此之快
设计采⽤了⾃下⽽上的⽅式
(1)着眼硬件,先想后做,充分利⽤CPU L3的缓存
(2)算法在前,抽象在后,在字符串搜索⽅⾯,对于常量,使⽤Volnitsky算法,对于⾮常量,使⽤CPU的向量化执⾏SIMD,暴⼒优化;正则匹配使⽤re2和hyperscan算法,性能是算法选择的⾸要考量标准
(3)⽤于尝鲜,不⾏就换,选择最合适、最快的算法
(4)特定场景,特殊优化,根据数据量不同选择不同的算法。去重计数uniqCombined函数,当数据量较⼩的时候,选择Array保存,当数据量中等的时候,选择HashSet保存,当数据量很⼤的时候,使⽤HyperLogLog算法。对于数据结构⽐较清晰的场景,使⽤代码⽣成技术实现循环展开,以减少循环次数,SIMD被⼴泛应⽤于⽂本转换、数据过滤、数据解压和JSON转换
(5)持续测试,持续改进,使⽤真实场景的数据进⾏测试。
第3章安装与部署
这部分使⽤RPM包安装⽐较简单,下载RPM包后,执⾏下述命令进⾏安装
[root@mdw clickhouse]# ls
clickhouse-client-20.3.12.112-1.el7.x86_64.rpm clickhouse-server-20.3.12.112-1.el7.x86_64.rpm
clickhouse-common-static-20.3.12.112-1.el7.x86_64.rpm clickhouse-server-common-20.3.12.112-1.el7.x86_64.rpm
[root@mdw clickhouse]# rpm -ivh *.rpm
< >>>>>>### [100%]
Updating /
1:clickhouse-server-common-20.3.12.>>>>>>### [ 25%]
2:clickhouse-common-static-20.3.12.>>>>>>### [ 50%]
3:clickhouse-server-20.3.12.112-1.e>>>>>>### [ 75%]
Create user clickhouse.clickhouse with datadir /var/lib/clickhouse
4:clickhouse-client-20.3.12.112-1.e>>>>>>### [100%]
Create user clickhouse.clickhouse with datadir /var/lib/clickhouse
启动服务端
[root@mdw clickhouse-server]# service clickhouse-server start
Start clickhouse-server service: Path to data directory in /etc/l: /var/lib/clickhouse/
DONE
启动客户端
[root@mdw clickhouse-server]# clickhouse-client
ClickHouse client version 20.3.12.112.
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 20.3.12 revision 54433.
mdw :) show databases;
SHOW DATABASES
┌─name────┐
│ default │
│ system │
└─────────┘
2 rows in set. Elapsed: 0.007 sec.
⽬录结构说明:
(1)/etc/clickhouse-server/:服务端的配置⽂件⽬录,包括全局配置l和⽤户配置l,详细如下所⽰:
[root@mdw clickhouse-server]# ll /etc/clickhouse-server/
total 32
-rw-r--r-- 1 root root 22610 Jun 25 21:l
-rw-r--r-- 1 root root 5190 Jun 25 21:l
(2)/var/lib/clickhouse/:默认的数据存储⽬录,详细如下所⽰:
[root@mdw clickhouse-server]# ll /var/lib/clickhouse/
total 4
drwxr-x--- 2 clickhouse clickhouse 6 Jul 16 15:08 cores
drwxr-x--- 4 clickhouse clickhouse 35 Jul 16 15:08 data
drwxr-x--- 2 clickhouse clickhouse 6 Jul 16 15:08 dictionaries_lib
drwxr-x--- 2 clickhouse clickhouse 6 Jul 16 15:08 flags
drwxr-x--- 2 clickhouse clickhouse 6 Jul 16 15:08 format_schemas
drwxr-x--- 4 clickhouse clickhouse 35 Jul 16 15:08 metadata
drwxr-x--- 2 clickhouse clickhouse 41 Jul 16 15:08 preprocessed_configs
-
rw-r----- 1 clickhouse clickhouse 58 Jul 16 15:08 status
drwxr-x--- 2 clickhouse clickhouse 6 Jul 16 15:08 tmp
drwxr-x--- 2 clickhouse clickhouse 6 Jul 16 15:08 user_files
(3)/var/log/clickhouse-server/:默认保存⽇志的⽬录,详细如下所⽰:
[root@mdw clickhouse-server]# ll /var/log/clickhouse-server/
total 68
-rw-r----- 1 clickhouse clickhouse 0 Jul 16 15:log
-rw-r----- 1 clickhouse clickhouse 61856 Jul 16 15:16 clickhouse-server.log
-rw-r----- 1 clickhouse clickhouse 568 Jul 16 15:08 stderr.log
-rw-r----- 1 clickhouse clickhouse 0 Jul 16 15:08 stdout.log
上述是使⽤RPM包安装的⽅式,也可以使⽤源码编译安装,⾃⼰也是折腾了好⼏天才编译通过,有三点经验分享:
(1)直接从github下载代码,速度受到限制,尤其下载第三⽅依赖包的时间会很长,⾃⼰尝试了⼏次,下载速度只有⼏k每秒,最后采⽤将github路径克隆到码云上的⽅式解决了;
(2)代码下载完成后,编译时,不要使⽤配置很低的虚拟机进⾏编译,要不然可能1~2天也⽆法编译完成,建议使⽤配置较好⼀点的物理机编译;
(3)clickhouse依赖的第三⽅源码,并没有指明具体的版本,所以在编译时,要通过git多切换⼏次版本,多次尝试,将clickhouse本⾝的代码与依赖第三⽅代码的版本匹配⼀致,才能编译成功,同时要注意,当切换了第三⽅源码的版本后,需要对应修改clickhouse中的CMakeList⽂件,要不然会出现不匹配或者⽂件不到的问题。
第4章数据定义
4.1 ClickHouse的数据类型
⼤致分为三类:基础类型、复合类型和特殊类型
关于数据类型的详细信息,在下⾯的⽹址上有详细的信息,这⾥不再赘述,只是对⼏个特殊的地⽅进⾏说明。
(1)ClickHouse⽀持正⽆穷、负⽆穷和⾮数字的表达⽅式,⽰例如下:
mdw :) select 0.8/0
SELECT 0.8 / 0
┌─divide(0.8, 0)─┐
│ inf │
└────────────────┘
1 rows in set. Elapsed: 0.005 sec.
mdw :) select -0.8/0
SELECT -0.8 / 0
┌─divide(-0.8, 0)─┐
│ -inf │
└─────────────────┘
1 rows in set. Elapsed: 0.004 sec.
mdw :) select 0/0
SELECT 0 / 0
┌─divide(0, 0)─┐
│ nan │
└──────────────┘
1 rows in set. Elapsed: 0.003 sec.
(2)不同精度定点数之间的四则运算

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论