Clickhouse学习笔记 一

什么是olap,oltp?

  • olap,即联机分析处理OLAP(OnLine Analytical Processing)OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。下面是aws对于olap的解释:

联机分析处理(OLAP)是一种软件技术,可用于从不同的角度分析业务数据。组织收集和存储来自多个数据源的数据,例如网站、应用程序、智能电表和内部系统。OLAP 将这些数据合并分为几类,为战略规划提供切实可行的见解。例如,零售商存储有关其销售的所有产品的数据,例如颜色、尺寸、成本和位置。零售商还在不同的系统中收集客户购买数据,例如所订购商品的名称和总销售价值。OLAP 合并数据集以回答诸如哪些颜色产品更受欢迎或产品展示位置如何影响销售等问题。

  • oltp,联机事务处理OLTP(OnLine Transaction Processing)的核心概念则是“事务”,任何支持OLTP的系统,首先必须要支持事务,这是一切基于OLTP系统建立的系统的基础。比如银行,交易,电商等。

对比olap和oltp

oltp

  • oltp系统通常提供一线员工,客户使用,通常需要处理大量简单的事务。
  • 使用场景上oltp通常用于日常操作
  • oltp大多数情况下会是关系型数据库实现。
  • 通常要求极低延迟响应,以避免直接影响用户体验。
  • 支持修改数据。

olap

  • olap通常面向分析师,数据科学家,还可以用于bi(商业智能)和各类展示大屏
  • 使用场景上用于分析决策
  • olap的查询通常较为复杂,可能涉及大量数据。
  • olap系统查询延迟会比oltp高的多
  • olap系统不会修改数据

oltp的瓶颈

oltp的使用场景通常读写流量相差不大,某些读流量较大的场景,系统维护人员会选择添加配置缓存,或者横向扩展oltp数据,比如分开分表,但总的来说,实际落到数据库层面的读写基本是平衡的。

而olap是读请求远远大于写请求,因此这样的系统更注重磁盘吞吐量,如能达到多少MB/s的流量。
而大多数用于较大规模的支持事务的系统衡量其依赖的oltp数据库时都会提到的一个重要指标是tps。

在OLAP系统中,通常使用分区技术、并行技术用于提升吞吐量,对于clickhouse这样的列式数据库,还可以进行数据压缩,simd等技术进一步加速读取,但是这类技术在oltp的老本行“事务”上并没有什么施展拳脚之处,反而可能造成实现的复杂性。

此外,olap业务场景往往复杂,试想一下,如果对一张存有上亿行数据的数据表同时执行数十个字段的GROUP BY查询,将会发生什么事情?

列式存储和行式存储

为什么列式存储在olap领域大放异彩呢?

不多说,直接把clickhouse官方文档里的动图拿过来
行式存储
1

列式存储
2

显而易见,一个几十个字段的常规关系型数据库表,即使只读3-4个字段用于聚合,也必须将整行读出,此时无效的磁盘读被放大了几十倍。

此外列式存储往往是数据压缩的前提,而数据压缩又能增大olap的关键指标,吞吐量。数据压缩的本质就是合并重复项,数据重复项越多,压缩率越高。对于行式存储来讲,行与行之间相关性必然比列式存储中,每列中项与项之间相关性小。

clickhouse

clickhouse是俄罗斯的Yandex公司开发的,是世界上最大的俄语搜索引擎。搜索引擎业务非常依赖流量和在线广告分析,clickhouse就是在这样的背景下诞生的。

单机部署

下面就来实操下

1. sse检测

clickhouse依赖sse指令来加速计算

1
$ grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"

2. 环境

笔者测试的环境是

1
2
fenix@fenixs:~$ uname -a
Linux fenixs 5.19.0-46-generic #47-Ubuntu SMP PREEMPT_DYNAMIC Fri Jun 16 13:30:11 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

3. 安装

1
2
3
4
5
6
7
8
9
10
11
sudo apt-get install -y apt-transport-https ca-certificates dirmngr
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 8919F6BD2B48D754

echo "deb https://packages.clickhouse.com/deb stable main" | sudo tee \
/etc/apt/sources.list.d/clickhouse.list
sudo apt-get update

sudo apt-get install -y clickhouse-server clickhouse-client

sudo service clickhouse-server start
clickhouse-client # or "clickhouse-client --password" if you've set up a password.

4. 测试

使用clickhouse-client 连接本地

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
fenix@fenixs:~/clickhouse$ clickhouse-client
ClickHouse client version 23.8.2.7 (official build).
Connecting to localhost:9000 as user default.
Password for user (default):
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 23.8.2 revision 54465.

fenixs :) select 1;

SELECT 1

Query id: 88596620-a9c4-4ca6-b65e-b7a574055aab

┌─1─┐
│ 1 │
└───┘

1 row in set. Elapsed: 0.002 sec.

至此,部署完毕,后文将详细讲解clickhouse的具体玩法。