Clickhouse第一讲-CK概述

这篇博客介绍了Clickhouse在OLAP场景中的应用,强调了列式存储在数据读取和分析上的优势,以及其数据压缩和向量化执行引擎(SIMD)提高查询效率的特点。还涵盖了Clickhouse支持的标准SQL查询、多线程分布式处理及安装配置流程。
摘要由CSDN通过智能技术生成

常用的数据架构

OLAP场景

绝大多数是读请求。 
数据以相当大的批次(> 1000 行)更新,而不是单行更新;或者根本没有更新。 
已添加到数据库的数据不能修改。 
对于读取,从数据库中提取相当多的行,但只提取列的一小部分。 
宽表,即每个表包含着大量的列。 
查询相对较少(通常每台服务器每秒查询数百次或更少)。 
对于简单查询,允许延迟大约 50 毫秒。 
列中的数据相对较小:数字和短字符串(例如,每个 URL 60 个字节)。  处理单个查询时需要高吞吐量(每台服务器每秒可达数十亿行)。

事务不是必须的。 
对数据一致性要求低。有副本情况下,写入一个即可,后台自动同步。

每个查询有一个大表。除了他以外,其他的都很小。

查询结果明显小于源数据。换句话说,数据经过过滤或聚合,因此结果适合于单个服务器的 RAM 中

行存储与列存储 

行存储在数据写入和修改上的优势

行存储的写入是一次完成的,如果这种写入建立在操作系统的文件系统上,可以保证写 入过程的成功或者失败,可以保证数据的完整性。列式存储需要把一行记录拆分成单列保存, 写入次数明显比行存储多(因为磁头调度次数多,而磁头调度是需要时间的,一般在 1ms~10ms),再加上磁头需要在盘片上移动和定位花费的时间,实际消耗更大。 数据修改实际上也是一次写入过程,不同的是,数据修改是对磁盘上的记录做删除标记。 行存储是在指定位置写入一次,列存储是将磁盘定位到多个列上分别写入,这个过程仍是行 存储的列数倍。 所以,行式存储在数据写入和修改上具有很大优势。

列式存储在数据读取和解析、分析数据上具有优势

数据读取时,行存储通常将一行数据完全读出,如果只需要其中几列数据的情况,就会 存在冗余列,出于缩短处理时间的考量,消除冗余列的过程通常是在内存中进行的。列存储 每次读取的数据是集合的一段或者全部,不存在冗余性问题。 列式存储中的每一列数据类型是相同的,不存在二义性问题,例如,某列类型为整型 int,那么它的数据集合一定是整型数据,这种情况使数据解析变得十分容易。相比之下,行存储则要复杂得多,因为在一行记录中保存了多种类型的数据,数据解析需要在多种数据 类型之间频繁转换,这个操作很消耗 CPU,增加了解析的时间。

所以,列式存储在数据读取和解析数据做数据分析上更具优势。
综上所述,行存储的写入是一次性完成,消耗的时间比列存储少,并且能够保证数据的
完整性,缺点是数据读取过程中会产生冗余数据,如果只有少量数据,此影响可以忽略,数
量大可能会影响到数据的处理效率。列存储在写入效率、保证数据完整性上都不如行存储,
它的优势是在读取过程,不会产生冗余数据,这对数据完整性要求不高的大数据处理领域比
较重要。一般来说一个 OLAP 类型的查询可能需要访问几百万或者几十亿行的数据,但是
OLAP 分析时只是获取少数的列,对于这种场景列式数据库只需要读取对应的列即可,行式
数据库需要读取所有的数据列,因此这种场景更适合列式数据库,可以大大提高 OLAP 数据
分析的效率。 ClickHouse 就是一款使用列式存储的数据库,数据按列进行组织,属于同
一列的数据会被保存在一起,列与列之间也会由不同的文件分别保存,在对 OLAP 场景分析
时,效率很高。

CK的数据压缩

ClickHouse 默认 使用 LZ4 算法压缩,数据总体压缩比可达 8:1
ClickHouse 采用列式存储,列式存储相对于行式存储另一个优势就是对数据压缩的
友好性。例如:有两个字符串“ABCDE”,“BCD ”,现在对它们进行压缩:

 通过以上案例可以看到,压缩的本质是按照一定步长对数据进行匹配扫描,当发现重复 部分的时候就进行编码转换。例如:(5,3)代表从下划线往前数 5 个字节,会匹配上 3 个 字节长度的重复项,即:“BCD”。当然,真实的压缩算法比以上举例更复杂,但压缩的本 质就是如此,数据中重复性项越多,则压缩率越高,压缩率越高,则数据体量越小,而数据 体量越小,则数据在网络中的传输越快,对网络带宽和磁盘 IO 的压力也就越小。

列式存储中同一个列的数据由于它们拥有相同的数据类型和现实语义,可能具备重复项 的可能性更高,更利于数据的压缩。所以 ClickHouse 在数据压缩上比例很大。

向量化执行引擎(SIMD)-SSE4.2指令集【数据并行】

在计算机系统的体系结构中,存储系统是一种层次结构,典型服务器计算机的存储层次
结构如上图,上图表述了 CPU CPU 三级缓存、内存、磁盘数据容量与数据读取速度对比,
我们可以看出存储媒介距离 CPU 越近,则访问数据的速度越快。
由上图可知,从内存读取数据速度比磁盘读取数据速度要快 1000 倍,从 CPU 缓存中 读取数据的速度比从内存中读取数据的速度最快要快 100 倍,从 CPU 寄存器中读取数据的 速度为 300ps(1000ps 皮秒 = 1ns),比 CPU 缓存要快 3 倍还多。从寄存器中访问数据 的速度,是从内存访问数据速度的 300 倍,是从磁盘中访问数据速度的 30 万倍。 如果能从 CPU 寄存器中访问数据对程序的性能提升意义非凡,向量化执行就是在寄存 器层面操作数据,为上层应用程序的性能带来了指数级的提升。
何为向量化执行?向量化执行,可以简单地看作一项消除程序中循环的优化。
你可以使用 clickhouse-driver 库来将 DataFrame 数据传输到 ClickHouse 库中。具体步骤如下: 1. 首先,安装 clickhouse-driver 库。在终端输入以下命令: ``` pip install clickhouse-driver ``` 2. 在 Python 中导入 clickhouse-driver 库: ``` import clickhouse_driver ``` 3. 创建 ClickHouse 客户端对象,连接到 ClickHouse 服务器: ``` client = clickhouse_driver.Client('localhost') ``` 这里的 localhost 是 ClickHouse 服务器的地址,如果不在本机上,需要填写相应的 IP 地址。 4. 创建数据表。可以使用普通的 SQL 语句来创建数据表,例如: ``` client.execute('CREATE TABLE test (id Int32, name String) ENGINE = Memory') ``` 5. 将 DataFrame 转换为 ClickHouse 中的数据格式。clickhouse-driver 库提供了一个将 DataFrame 转换为 ClickHouse 格式的函数,例如: ``` data = [(1, 'Alice'), (2, 'Bob'), (3, 'Charlie')] columns = ['id', 'name'] df = pd.DataFrame(data, columns=columns) prepared_data = client.prepare_insert('test', df.columns) prepared_data.executemany(df.values) ``` 这里的 df 是一个 Pandas 的 DataFrame,data 是该 DataFrame 中的数据。使用 client.prepare_insert 函数,将 DataFrame 的列名传递给 ClickHouse。然后,使用 prepared_data.executemany 函数,将 DataFrame 中的数据插入到 ClickHouse 表中。 6. 查询数据。可以使用普通的 SQL 语句来查询数据,例如: ``` data = client.execute('SELECT * FROM test') ``` 这里的 data 是一个包含查询结果的列表。 这样,就可以在 Python 中将 DataFrame 数据传输到 ClickHouse 库中了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值