人工智能-机器学习

ClickHouse原理解析与应用实践

2021-12-13  本文已影响0人  yeedom

第1章 ClickHouse的前世今生

1.1 传统BI系统之殇

1.2 现代BI系统的新思潮

  1. 一方面,SaaS模式将之前只服务于中大型企业的软件系统放到了互联网,扩展了它的受众;
  2. 另一方面,由于互联网用户的基本特征和软件诉求,又倒逼了这些软件系统在方方面面进行革新与升级

2003年起,Google陆续发表的三篇论文开启了大数据的技术普惠,Hadoop生态由此开始一发不可收拾,数据分析开启了新纪元。从某种角度来看,以使用Hadoop生态为代表的这类非传统关系型数据库技术所实现的BI系统,可以称为现代BI系统

1.3 OLAP常见架构分类

  1. 下钻:从高层次向低层次明细数据穿透。例如从“省”下钻到“市
  2. 上卷:和下钻相反,从低层次向高层次汇聚。例如从“市”汇聚成“省
  3. 切片:观察立方体的一层,将一个或多个维度设为单个固定值,然后观察剩余的维度,例如将商品维度固定为“足球
  4. 切块:与切片类似,只是将单个固定值变成多个值。例如将商品维度固定成“足球”“篮球
  5. 旋转:旋转立方体的一面,如果要将数据映射到一张二维表,那么就要进行旋转,这就等同于行列置换
image-20211023201438413

OLAP架构大致分成三类

ROLAP(RelationalOLAP,关系型OLAP)

MOLAP(MultidimensionalOLAP,多维型OLAP)

  1. 维度预处理可能会导致数据的膨胀
  2. 其立方体预聚合后的数据量可能会达到10到20倍的膨胀
  3. 由于使用了预处理的形式,数据立方体会有一定的滞后性,不能实时进行数据分析

HOLAP(HybridOLAP,混合架构的OLAP)

1.4 OLAP实现技术的演进

传统关系型数据库阶段

大数据技术阶段

  1. 由于大数据处理技术的普及,人们开始使用大数据技术重构ROLAPMOLAP。以ROLAP架构为例,传统关系型数据库就被HiveSparkSQL这类新兴技术所取代
  2. 大数据技术阶段,主流MOLAP架构已经能够在亿万级数据的体量下,实现毫秒级的查询响应时间。尽管如此,MOLAP架构依然存在维度爆炸、数据同步实时性不高的问题

1.5 一匹横空出世的黑马

  1. 一站式:下至数百条数据的个人Excel表格,上至数亿级别的企业数据,都能够在系统内部被直接处理
  2. 自服务,简单易用:面向普通用户而非专业IT人员,通过简单拖拽或搜索维度,就能完成初步的分析查询
  3. 实时应答:无论数据是什么体量级别,查询必须在毫秒至1秒内返回
  4. 专业化、智能化:需要具备专业化程度并具备智能化的提升空间,需要提供专业的数学方法

详细测试结果:https://clickhouse.yandex/benchmark.html

1.6 ClickHouse的发展历程

ClickHouse的发展历程

image-20211023201841353

1.7 ClickHouse的名称含义

image-20211023201901111

1.8 ClickHouse适用的场景

1.9 ClickHouse不适用的场景

  1. 不支持事务
  2. 不擅长根据主键按行粒度进行查询(虽然支持),故不应该把ClickHouse当作KeyValue数据库使用
  3. 不擅长按行删除数据(虽然支持)

1.10 有谁在使用ClickHouse


第2章 ClickHouse架构概述

Yandex.Metrica目前已经成为世界第三大Web流量分析平台,每天处理超过200亿个跟踪事件。能够拥有如此惊人的体量,在它背后提供支撑的ClickHouse功不可没。ClickHouse已经为Yandex.Metrica存储了超过20万亿行的数据,90%的自定义查询能够在1秒内返回,其集群规模也超过了400台服务器

2.1 ClickHouse的核心特性

ClickHouse是一款MPP架构的列式存储数据库

完备的DBMS功能

  1. DDL(数据定义语言)
  2. DML(数据操作语言)
  3. 权限控制
  4. 数据备份与恢复
  5. 分布式管理

列大存储与数据压缩

向量化执行引擎

图21 距离CPU越远,数据的访问速度越慢

image-20211023202106178

关系模型与SQL查询

多样化的表引擎

多线程与分布式

多主架构

在线查询

  1. Vertica这类商用软件价格高昂
  2. SparkSQLHive这类系统无法保障90%的查询在1秒内返回,在大数据量下的复杂查询可能会需要分钟级的响应时间;
  3. Elasticsearch这类搜索引擎在处理亿级数据聚合查询时则显得捉襟见肘

ClickHouse的“广告词”所言,其他的开源系统太慢,商用的系统太贵,只有Clickouse在成本与性能之间做到了良好平衡,即又快又开源

数据分片与分布式查询

2.2 ClickHouse的架构设计

Column与Field

图22 ClickHouse架构设计中的核心模块

image-20211023202512308

DataType

Block与Block流

Table

Functions与Aggregate Functions

Cluster与Replication

  1. ClickHouse的1个节点只能拥有1个分片,也就是说如果要实现1分片、1副本,则至少需要部署2个服务节点
  2. 分片只是一个逻辑概念,其物理承载还是由副本承担的

代码清单21 自定义集群ch_cluster的配置示例

image-20211023202641833

2.3 ClickHouse为何如此之快

着眼硬件,先想后做

  1. 我们将要使用的硬件水平是怎样的?包括CPU、内存、硬盘、网络等
  2. 在这样的硬件上,我们需要达到怎样的性能?包括延迟、吞吐量等
  3. 我们准备使用怎样的数据结构?

算法在前,抽象在后

勇于尝鲜,不行就换

特定场景,特殊优化


第3章 安装与部署

3.2 客户端的访问接口

CLI

image-20211023202839996 image-20211023202856777 image-20211023202911784 image-20211023202937350 image-20211023202949442 image-20211023203009420

3.3 内置的实用工具

clickhouse-local

image-20211023203054941 image-20211023203105872 image-20211023203117015 image-20211023203131298 image-20211023203146789 image-20211023203155324 image-20211023203207911

第4章 数据定义

4.1 ClickHouse的数据类型

  1. 数值
  2. 字符串
  3. 时间
  1. 整数
  2. 浮点数
  3. 定点数
  1. Int8
  2. Int16
  3. Int32
  4. Int64

其末尾的数字正好表明了占用字节的大小(8位=1字节)

  1. 正无穷
  2. 负无穷
  3. 非数字
  1. String
  2. FixedString
  3. UUID
  1. 数组:在同一个数组内可以包含多种数据类型,例如数组[1,2.0]是可行的。但各类型之间必须兼容,例如数组[1,'2']则会报错
  2. 元组:元组类型由1~n个元素组成,每个元素之间允许设置不同的数据类型,且彼此之间不要求兼容
  3. 枚举
  4. 嵌套:嵌套类型,顾名思义是一种嵌套表结构。一张数据表,可以定义任意多个嵌套类型字段,但每个字段的嵌套层级只支持一级。每个数组的元素个数必须相等。在访问嵌套类型的数据时需要使用点符号
  1. 首先,它只能和基础类型搭配使用,不能用于数组和元组这些复合类型,也不能作为索引字段;
  2. 应该慎用Nullable类型,包括Nullable的数据表,不然会使查询和写入性能变慢。因为在正常情况下,每个列字段的数据会被存储在对应的[Column].bin文件中。如果一个列字段被Nullable类型修饰后,会额外生成一个[Column].null.bin文件专门保存它的Null值。这意味着在读取和写入数据时,需要一倍的额外文件操作
  1. IPv4
  2. IPv6

4.2 如何定义数据表

  1. Ordinary:默认引擎,在绝大多数情况下我们都会使用默认引擎,使用时无须刻意声明。在此数据库下可以使用任意类型的表引擎
  2. Dictionary:字典引擎
  3. Memory:内存引擎,用于存放临时数据
  4. Lazy:日志引擎,此类数据库下只能使用Log系列的表引擎
  5. MySQLMySQL引擎,此类数据库下会自动拉取远端MySQL中的数据,并为它们创建MySQL表引擎的数据表
  1. 使用[db_name.]参数可以为数据表指定数据库,如果不指定此参数,则默认会使用default数据库
  2. 第二种定义方法是复制其他表的结构
  3. 第三种定义方法是通过SELECT子句的形式创建
  1. 数据写入:在数据写入时,只有DEFAULT类型的字段可以出现在INSERT语句中。而MATERIALIZEDALIAS都不能被显式赋值,它们只能依靠计算取值
  2. 数据查询:在数据查询时,只有DEFAULT类型的字段可以通过SELECT返回。而MATERIALIZEDALIAS类型的字段不会出现在SELECT查询的返回结果集中
  3. 数据存储:在数据存储时,只有DEFAULTMATERIALIZED类型的字段才支持持久化。如果使用的表引擎支持物理存储(例如TinyLog表引擎),那么这些列字段将会拥有物理存储。而ALIAS类型的字段不支持持久化,它的取值总是需要依靠计算产生,数据不会落到磁盘
  1. 它的生命周期是会话绑定的,所以它只支持Memory表引擎,如果会话结束,数据表就会被销毁;
  2. 临时表不属于任何数据库,所以在它的建表语句中,既没有数据库参数也没有表引擎参数。

临时表的优先级是大于普通表的。当两张数据表名称相同的时候,会优先读取临时表的数据

image-20211125223049579 image-20211125223057898 image-20211125223117716

两种视图

普通视图

物化视图

4.3 数据表的基本操作

4.4 数据分区的基本操作

4.5 分布式DDL执行

4.6 数据的写入

  1. 第一种是使用VALUES格式的常规语法:
image-20211125223353036
  1. 第二种是使用指定格式的语法:
image-20211125223410855
  1. 第三种是使用SELECT子句形式的语法:
image-20211125223426497 image-20211125223437270

4.7 数据的删除与修改

  1. 首先,Mutation语句是一种“很重”的操作,更适用于批量数据的修改和删除;
  2. 其次,它不支持事务,一旦语句被提交执行,就会立刻对现有数据产生影响,无法回滚;
  3. 最后,Mutation语句的执行是一个异步的后台过程,语句被提交之后就会立即返回。

所以这并不代表具体逻辑已经执行完毕,它的具体执行进度需要通过system.mutations系统表查询


第5章 数据字典

上一篇 下一篇

猜你喜欢

热点阅读