数仓选型必列入考虑的OLAP列式数据库ClickHouse(上)
概述
定义
ClickHouse官网地址 https://clickhouse.com/ 最新版本22.4.5.9
ClickHouse官网文档地址 https://clickhouse.com/docs/zh
ClickHouseGitHub源码地址 https://github.com/ClickHouse/ClickHouse
ClickHouse是俄罗斯的 Yandex 于 2016 年开源的用于在线分析处理查询(OLAP :Online Analytical Processing)MPP架构的列式存储数据库(DBMS:Database Management System),能够使用 SQL 查询实时生成分析数据报告。ClickHouse的全称是Click Stream,Data WareHouse。ClickHouse可以做用户行为分析,流批一体,其线性扩展和可靠性保障能够原生支持 分片和副本,shard + replication,ClickHouse没有走hadoop生态自己实现分布式存储。
- OLAP场景的关键特征
- 绝大多数是读请求
- 数据以相当大的批次(> 1000行)更新,而不是单行更新;或者根本没有更新。
- 已添加到数据库的数据不能修改。
- 对于读取,从数据库中提取相当多的行,但只提取列的一小部分。
- 宽表,即每个表包含着大量的列
- 查询相对较少(通常每台服务器每秒查询数百次或更少)
- 对于简单查询,允许延迟大约50毫秒
- 列中的数据相对较小:数字和短字符串(例如,每个URL 60个字节)
- 处理单个查询时需要高吞吐量(每台服务器每秒可达数十亿行)
- 事务不是必须的
- 对数据一致性要求低
- 每个查询有一个大表。除了他以外,其他的都很小。
- 查询结果明显小于源数据。换句话说,数据经过过滤或聚合,因此结果适合于单个服务器的RAM中
- 很容易可以看出,OLAP场景与其他通常业务场景(例如,OLTP或K/V)有很大的不同, 因此想要使用OLTP或Key-Value数据库去高效的处理分析查询场景,并不是非常完美的适用方案。例如,使用OLAP数据库去处理分析请求通常要优于使用MongoDB或Redis去处理分析请求。
- 列式数据库更适合OLAP场景的原因
- 针对分析类查询,通常只需要读取表的一小部分列。在列式数据库中你可以只读取你需要的数据。例如,如果只需要读取100列中的5列,这将帮助你最少减少20倍的I/O消耗。
- 由于数据总是打包成批量读取的,所以压缩是非常容易的。同时数据按列分别存储这也更容易压缩。这进一步降低了I/O的体积。
- 由于I/O的降低,这将帮助更多的数据被系统缓存。
- CPU
- 向量引擎:所有的操作都是为向量而不是为单个值编写的。这意味着多个操作之间的不再需要频繁的调用,并且调用的成本基本可以忽略不计。操作代码包含一个优化的内部循环。
- 代码生成:生成一段代码,包含查询中的所有操作。
特性
- 真正的列式数据库管理系统:ClickHouse不单单是一个数据库, 它是一个数据库管理系统。因为它允许在运行时创建表和数据库、加载数据和运行查询,而无需重新配置或重启服务.
- 数据压缩:支持通用压缩编解码器之外,ClickHouse还提供针对特定类型数据的专用编解码器。
- 数据的磁盘存储:ClickHouse被设计用于工作在传统磁盘上的系统,它提供每GB更低的存储成本,但如果可以使用SSD和内存,它也会合理的利用这些资源。
- 多核心并行处理
- 多服务器分布式处理
- 支持SQL
- 向量引擎
- 实时的数据更新
- 索引
- 适合在线查询
- 支持近似计算
- 自适应连接算法
- 支持数据复制和数据完整性
- 角色的访问控制
- 限制
- 没有完整的事务支持。
- 缺少高频率,低延迟的修改或删除已存在数据的能力。仅能用于批量删除或修改数据,但这符合 GDPR。
- 稀疏索引使得ClickHouse不适合通过其键检索单行的点查询。
性能
- 单个大查询吞吐量:如果数据被放置在page cache中,则一个不太复杂的查询在单个服务器上大约能够以2-10GB/s(未压缩)的速度进行处理。
- 处理短查询的延迟时间:如果一个查询使用主键并且没有太多行(几十万)进行处理,并且没有查询太多的列,那么在数据被page cache缓存的情况下,它的延迟应该小于50毫秒。
- 处理大量短查询的吞吐量:在相同的情况下,ClickHouse可以在单个服务器上每秒处理数百个查询。
- 写入速度大约为50到200MB/s。如果您写入的数据每行为1Kb,那么写入的速度为50,000到200,000行每秒。
为什么ClickHouse这么快?
- 面向列的存储:源数据通常包含数百甚至数千列,而报表可以只使用其中的少数列。系统需要避免读取不必要的列,否则最昂贵的磁盘读取操作将被浪费。
- 索引:ClickHouse将数据结构保存在内存中,不仅允许读取已使用的列,还允许读取这些列的必要行范围。
- 数据压缩:将同一列的不同值存储在一起通常会带来更好的压缩比(与面向行的系统相比),因为在实际数据中,列的相邻行通常具有相同或不那么多的不同值。除了通用压缩,ClickHouse还支持专门的编解码器,可以使数据更加紧凑。
- 向量化查询执行:ClickHouse不仅在列中存储数据,还在列中处理数据。它可以提高CPU缓存利用率,并允许使用SIMD CPU指令。
- 可伸缩性:ClickHouse可以利用所有可用的CPU核和磁盘执行单个查询。不仅在单个服务器上,而且在集群的所有CPU核和磁盘上也是如此。
安装部署
系统要求
ClickHouse可以在任何具有x86_64,AArch64或PowerPC64LE CPU架构的Linux,FreeBSD或Mac OS X上运行。
官方预构建的二进制文件通常针对x86_64进行编译,并利用SSE 4.2
指令集,因此,除非另有说明,支持它的CPU使用将成为额外的系统需求。下面是检查当前CPU是否支持SSE 4.2的命令:
$ grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"
要在不支持SSE 4.2
或AArch64
,PowerPC64LE
架构的处理器上运行ClickHouse,您应该通过适当的配置调整从源代码构建ClickHouse。
可用安装包
- DEB安装包
- RPM安装包
- Tgz安装包
- Docker安装包
- 其他环境安装包
- 使用源码安装
安装包列表:
clickhouse-common-static
— ClickHouse编译的二进制文件。clickhouse-server
— 创建clickhouse-server
软连接,并安装默认配置服务clickhouse-client
— 创建clickhouse-client
客户端工具软连接,并安装客户端配置文件。clickhouse-common-static-dbg
— 带有调试信息的ClickHouse二进制文件。
单机RPM包安装
单机部署比较简单,执行完下面四条命令就可以通过clickhouse-client来操作了
yum install -y yum-utils
yum-config-manager --add-repo https://packages.clickhouse.com/rpm/clickhouse.repo
yum install -y clickhouse-server clickhouse-client
/etc/init.d/clickhouse-server start
集群部署
ClickHouse集群是一个同质集群,操作步骤如下
- 分别在ckserver1(192.168.5.52)、ckserver2(192.168.5.53)、huawei27(192.168.12.27)这三台上按照上面的单机部署前面3行命令安装ClickHouse服务端。需提前准备Zookeeper,这样使用的是提前建好的3台Zookeeper集群(Zookeeper部署可以查看之前的文章)。
- 在配置文件中设置集群配置。主要配置zookeeper、remote_servers和macros节点数据,而macros数据在每个节点分别配置,ckserver1配置为01,ckserver2配置02,huawei27配置为03,在下面示例为配置一个3个分片和3个副本的集群。
<zookeeper>
<node>
<host>huawei27</host>
<port>2181</port>
</node>
<node>
<host>huawei28</host>
<port>2181</port>
</node>
<node>
<host>huawei29</host>
<port>2181</port>
</node>
</zookeeper>
<remote_servers>
<perftest_3shards_3replicas>
<shard>
<replica>
<host>ckserver1</host>
<port>9000</port>
</replica>
<replica>
<host>ckserver2</host>
<port>9000</port>
</replica>
<replica>
<host>huawei27</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>ckserver1</host>
<port>9000</port>
</replica>
<replica>
<host>ckserver2</host>
<port>9000</port>
</replica>
<replica>
<host>huawei27</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>ckserver1</host>
<port>9000</port>
</replica>
<replica>
<host>ckserver2</host>
<port>9000</port>
</replica>
<replica>
<host>huawei27</host>
<port>9000</port>
</replica>
</shard>
</perftest_3shards_3replicas>
</remote_servers>
<macros>
<shard>01</shard>
<replica>01</replica>
</macros>
修改完配置后分别在三台上执行/etc/init.d/clickhouse-server start,查询集群信息如下
接口
- ClickHouse提供了一个原生命令行客户端
clickhouse-client
客户端支持命令行--host, -h
-– 服务端的host名称, 默认是localhost
。您可以选择使用host名称或者IPv4或IPv6地址。--port
– 连接的端口,默认值:9000。注意HTTP接口以及TCP原生接口使用的是不同端口。--user, -u
– 用户名。 默认值:default
。--password
– 密码。 默认值:空字符串。--query, -q
– 使用非交互模式查询。--database, -d
– 默认当前操作的数据库. 默认值:服务端默认的配置(默认是default
)。--multiline, -m
– 如果指定,允许多行语句查询(Enter仅代表换行,不代表查询语句完结)。--multiquery, -n
– 如果指定, 允许处理用;
号分隔的多个查询,只在非交互模式下生效。--format, -f
– 使用指定的默认格式输出结果。--vertical, -E
– 如果指定,默认情况下使用垂直格式输出结果。这与–format=Vertical
相同。在这种格式中,每个值都在单独的行上打印,这种方式对显示宽表很有帮助。--time, -t
– 如果指定,非交互模式下会打印查询执行的时间到stderr
中。--stacktrace
– 如果指定,如果出现异常,会打印堆栈跟踪信息。--config-file
– 配置文件的名称。--secure
– 如果指定,将通过安全连接连接到服务器。--history_file
— 存放命令历史的文件的路径。--param_<name>
— 查询参数配置。
- HTTP客户端:HTTP接口允许您在任何编程语言的任何平台上使用ClickHouse,HTTP接口比原生接口受到更多的限制,但它具有更好的兼容性。默认情况下,
clickhouse-server
会在8123
端口上监控HTTP请求(这可以在配置中修改)。如果你发送了一个未携带任何参数的GET /
请求,它会返回一个字符串 «Ok.» - MySQL接口:ClickHouse支持MySQL wire通讯协议。
- JDBC驱动
- 官网驱动
- 第三方驱动:
- ClickHouse-Native-JDBC
- clickhouse4j
- ODBC驱动
- C++客户端库
- 第三方工具
- 客户端开发库,支持多种语言如Python、Java、Go、Php、NodeJs、Swift、Ruby、R、Scala、C#、Kotlin等等
- 第三方集成库
- 关系数据库:MySQL、MSSQL、PostgreSQL
- 消息队列:Kafka
- 流处理:Flink
- 对象存储:S3
- 容器编排:Kubernetes
- 监控:Grafana、Prometheus、Zabbix
- 第三方代理
- chproxy
- KittenHouse
- ClickHouse-Bulk
- 第三方开发的可视化界面
- 开源
- Tabix
- HouseOps
- 灯塔
- DBeaver
- clickhouse-cli
- clickhouse-flamegraph
- DBM
- 商业
- Holistics
- DataGrip
- 开源
创建数据库
默认情况下,ClickHouse使用Atomic数据库引擎。它提供了可配置的table engines和SQL dialect。创建一个测试数据库
CREATE DATABASE test ENGINE = Atomic;
use test;
创建数据表
# -m支持多行输入
clickhouse-client -m
使用最常见的MergeTree表引擎创建一张用户信息表user_info
CREATE TABLE user_info
(
id INT,
name String,
age Int8,
sex Int8,
career INT,
birthday Date
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(birthday)
ORDER BY (career, birthday);
# user_info插入两行数据
insert into user_info values(100,'张三',27,1,1000,'1998-05-21'),(101,'李婷',28,2,1001,'2000-07-25');
# 查询user_info数据
select * from user_info;
至此,ClickHouse的环境已经完全准备就绪,下一篇我们先通过一个案例需求学习ClickHouse使用,然后再层层深入。
数仓选型必列入考虑的OLAP列式数据库ClickHouse(上)的更多相关文章
- 数仓选型必列入考虑的OLAP列式数据库ClickHouse(中)
实战 案例使用 背景 ELK作为老一代日志分析技术栈非常成熟,可以说是最为流行的大数据日志和搜索解决方案:主要设计组件及架构如下: 而新一代日志监控选型如ClickHouse.StarRocks特别是 ...
- HAWQ取代传统数仓实践(十九)——OLAP
一.OLAP简介 1. 概念 OLAP是英文是On-Line Analytical Processing的缩写,意为联机分析处理.此概念最早由关系数据库之父E.F.Codd于1993年提出.OLAP允 ...
- 数仓建设 | ODS、DWD、DWM等理论实战(好文收藏)
本文目录: 一.数据流向 二.应用示例 三.何为数仓DW 四.为何要分层 五.数据分层 六.数据集市 七.问题总结 导读 数仓在建设过程中,对数据的组织管理上,不仅要根据业务进行纵向的主题域划分,还需 ...
- 数仓1.1 分层| ODS& DWD层
数仓分层 ODS:Operation Data Store原始数据 DWD(数据清洗/DWI) data warehouse detail数据明细详情,去除空值,脏数据,超过极限范围的明细解析具体表 ...
- 数仓day02
1. 什么是ETL,ETL都是怎么实现的? ETL中文全称为:抽取.转换.加载 extract transform load ETL是传数仓开发中的一个重要环节.它指的是,ETL负责将分布的. ...
- 数据源管理 | OLAP查询引擎,ClickHouse集群化管理
本文源码:GitHub·点这里 || GitEE·点这里 一.列式库简介 ClickHouse是俄罗斯的Yandex公司于2016年开源的列式存储数据库(DBMS),主要用于OLAP在线分析处理查询, ...
- 数仓1.4 |业务数仓搭建| 拉链表| Presto
电商业务及数据结构 SKU库存量,剩余多少SPU商品聚集的最小单位,,,这类商品的抽象,提取公共的内容 订单表:周期性状态变化(order_info) id 订单编号 total_amount 订单金 ...
- CarbonData:大数据融合数仓新一代引擎
[摘要] CarbonData将存储和计算逻辑分离,通过索引技术让存储和计算物理上更接近,提升CPU和IO效率,实现超高性能的大数据分析.以CarbonData为融合数仓的大数据解决方案,为金融转型打 ...
- 传统 BI 如何转大数据数仓
前几天建了一个数据仓库方向的小群,收集了大家的一些问题,其中有个问题,一哥很想去谈一谈--现在做传统数仓,如何快速转到大数据数据呢?其实一哥知道的很多同事都是从传统数据仓库转到大数据的,今天就结合身边 ...
随机推荐
- 4-Pandas数据预处理之数据转换(df.map()、df.replace())
在数据分析中,根据需求,有时候需要将一些数据进行转换,而在Pandas中,实现数据转换的常用方法有: 利用函数或是映射 可以将自己定义的或者是其他包提供的函数用在Pandas对象上实现批量修改. ap ...
- 在小程序Canvas中使用measureText
有时候我们在使用Canvas绘制一段文本时,会需要通过measureText()方法获取文本的宽度,例如: 创建canvas标签 <canvas id="canvas"> ...
- 【网易云信】H5 容器技术方案
Native 开发原生应用是手机操作系统厂商(目前主要是苹果的 iOS 和 Google 的 Android)对外界提供的标准化的开发模式,他们对于 Native 开发提供了一套标准化实现和优化方案. ...
- java中为什么接口中的属性都默认为static和final?
1)为什么接口中的属性都默认为static和final?Sun公司当初为什么要把java的接口设计发明成这样?[新手可忽略不影响继续学习]答:马克-to-win:接口中如果可能定义非final的变量的 ...
- add jars、add external jars、add library、add class folder的区别
add external jars = 增加工程外部的包add jars = 增加工程内包add library = 增加一个库add class folder = 增加一个类文件夹add jar是表 ...
- 简单的axios请求返回数据解构赋值
本地 data.json 文件 { "name": "大熊", "age": 18, "fnc": [ 1, 2, 3 ...
- JavaScript中数组的方法和字符串方法总结
数组是首先的一个对象, 可以通过Array构造器创建一个数组,数组方法总结如下 cacat() 链接两个数组 join() 将数组链接成字符串 pop() 删除最后一个元素 shift() 删 ...
- Java安全之Commons Collections6分析
Java安全之Commons Collections6分析 0x00 前言 其实在分析的几条链中都大致相同,都是基于前面一些链的变形,在本文的CC6链中,就和前面的有点小小的区别.在CC6链中也和CC ...
- 体育类1.2.0版本 带有社交性质的 app 并且有内购功能
上架经历 体育类1.2.0版本 应用是体育类的,带有社交性质的 app 并且有内购功能 - 关于内购 最初级的应该是内购的 产品类型 在开发者一开始设置的时候没有注意到区别: 消耗型产品 非消耗型 非 ...
- C++---继承和派生
继承和派生 在C++中, 代码重用是通过继承机制来实现的 继承, 就是在一个已经存在的类的基础上, 再建议一个新类 从已经有的类派生出新的类, 派生类就继承了基类的特征, 包括成员和方法 继承可以完成 ...