![cover](https://img-blog.csdnimg.cn/eccdc9a0941040868a9a93f6d6a9a9e7.png)
【ClickHouse】什么是ClickHouse?CK入门
➢ 由于某一列的数据类型都是相同的,针对于数据存储更容易进行数据压缩,每一列选择更优的数据压缩算法,大大提高了数据的压缩比重。几乎覆盖了标准 SQL 的大部分语法,包括 DDL 和 DML,以及配套的各种函数,用户管理及权限管理,数据的备份与恢复。但相反的,insert一条数据时,就得计算每个Value的存储地址。但当查找所有人的年龄时,就需要不停的查找,或者全表扫描,且遍历的很多数据都是不需要的
文章目录
一、ClickHouse入门
ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的
列式存储数据库
(DBMS),使用C++
语言编写,主要用于在线分析处理查询
(OLAP),能够使用 SQL 查询实时生成分析数据报告。
关键词:
- 列式存储
- 查询
- C++
1、列式存储
行式、列式指的是数据在磁盘上的组织结构
。以下表为例:
采用行式存储时,数据在磁盘上的组织结构是:
这种存储形式,好处是当查某个人的所有属性时,可以通过磁盘查找加顺序读取就可以。
SELECT * FROM t_user where id = 1;
但当查找所有人的年龄时,就需要不停的查找,或者全表扫描,且遍历的很多数据都是不需要的。
SELECT age FROM t_user ;
采用列式存储时,数据在磁盘上的组织结构是:
此时:
SELECT age FROM t_user ;
就很效率,把磁盘上的那一串连续数据读出来就行。但相反的,insert一条数据时,就得计算每个Value的存储地址。
两种存储方式,没有优劣,只有适用场景的问题。
列式存储的好处是:
➢ 对于列的聚合,计数,求和等统计操作原因优于行式存储
➢ 由于某一列的数据类型都是相同的,针对于数据存储更容易进行数据压缩,每一列选择更优的数据压缩算法,大大提高了数据的压缩比重。
➢ 由于数据压缩比更好,一方面节省了磁盘空间,另一方面对于 cache 也有了更大的
发挥空间。
2、DBMS的功能
几乎覆盖了标准 SQL 的大部分语法,包括 DDL 和 DML,以及配套的各种函数,用户管理及权限管理,数据的备份与恢复。
3、多样化引擎
ClickHouse 和 MySQL 类似,把表级的存储引擎
插件化,根据表的不同需求可以设定不同的存储引擎。目前包括合并树、日志、接口和其他四大类 20 多种引擎。
4、高吞吐写入能力
ClickHouse 采用类 LSM Tree
的结构,数据写入后定期在后台 Compaction。
通过类 LSM tree 的结构,ClickHouse 在数据导入时全部是顺序 append 写,写入后数据段不可更改,在后台compaction 时也是多个段 merge sort 后顺序写回磁盘。
顺序写的特性,充分利用了磁盘的吞吐能力,即便在 HDD 上也有着优异的写入性能。
官方公开 benchmark 测试显示能够达到 50MB-200MB/s 的写入吞吐能力,按照每行100Byte 估算,大约相当于 50W-200W 条/s 的写入速度。
5、数据分区与线程级并行
ClickHouse 将数据划分为多个 partition,每个 partition 再进一步划分为多个 index granularity(索引粒度),然后通过多个 CPU核心分别处理其中的一部分来实现并行数据处理。
在这种设计下,单条 Query 就能利用整机所有CPU
(很吃CPU)。极致的并行处理能力,极大的降低了查询延时。
所以,ClickHouse 即使对于大量数据的查询也能够化整为零平行处理。但是有一个弊端就是对于单条查询使用多 cpu,就不利于同时并发多条查询。所以对于高 qps(query per second) 的查询业务,ClickHouse 并不是强项。
从这儿可以看出ClickHouse不适合做初始的存储,其适用场景是
数据已经处理好的、字段特别多的宽表
6、性能对比
- 单表查询实验数据
- 关联查询实验数据
ClickHouse 像很多 OLAP 数据库一样,单表查询速度优于关联查询,且ClickHouse的两者差距更为明显。因此,在ClickHouse中尽量避免join(适用场景:宽表)。
7、官网
这里有文档和一个在线Demo
二、ClickHouse安装
1、准备工作
- 暂时关闭防火墙
systemctl status firewalld
systemctl stop firewalld
- CentOS取消打开文件数限制
# 查看Linux系统的一些限制
[root@9527 ~] ulimit -a
...
open files (-n) 1024 # 文件数
max user processes (-u)127882 # 最大用户进程数(ClickHouse比较吃CPU)
...
# 打开的文件最大数和某个用户最大的进程数和clickHouse相关
# 和ES调这个参数原因相同
sudo vim /etc/security/limits.conf
# 在末尾加入
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
# *即所有用户的所有组,也可对单独某个用户,则*改为user@groupname
# soft即软限制,就是当前的日常状态
# hard即硬限制,就是最大、上限,soft <= hard
# 也可之间用一个横线 - ,代表软硬一起配置了
# nofile即打开文件数,nproc即用户进程数
# 还要改下limits.d目录下文件的内容,因为它会覆盖上面limits.conf的配置
vim /etc/security/limits.d/20-nproc.conf
# 末尾加
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
# 以上配置生效不用重启。退出当前用户后重新登录即可
ulimit -a # 查看更改是否生效
- 安装相关依赖
sudo yum install -y libtool
sudo yum install -y *unixODBC*
- 在CentOS取消SELINUX
# S即安全E即增强
# SELINUX是Linux内核级别的一个系统安全防护,关掉是因为它管的太多了
sudo vim /etc/selinux/config
#改为disabled
SELINUX=disabled
# 这个是内核级别的,想生效得重启Linux
# 实在不想重启可以执行下面指令来临时生效
[root@9527 ~]getenforce
Disabled
[root@9527 ~]setenforce 0 # 0、1即开关
最后,如果是集群的话,别忘了将上面的操作在其他机器上同步一份。
2、单机安装
支持yum安装。再往下翻,选择下载离线安装包:click here
下载地址:https://packages.clickhouse.com/rpm/stable/
- 创建clickhouse目录
mkdir clickhouse
- 将四个rpm包拖到这个目录下
- 在clickhouse目录直接安装
*.rpm
sudo rpm -ivh *.rpm
# 中途会提示:
Enter password for default user:
# 即给clickhouse的默认用户default设置密码,回车默认密码为空即可
- 查看安装情况
rpm -qa|grep -i clickhouse
# 使用rpm包安装或者yum安装,和tar解压tar.gz包的安装不一样,后者可以直接在解压目录下看到conf等目录
# 而rpm包安装后,配置文件对应路径在/etc/clickhouse按Tab
# 而lib目录常在/var/lib/clickhouse按Tab
# 而bin目录则在usr/bin/按Tab或者usr/local/bin/按Tab
# 而log目录则在/var/log/按Tab
- 修改配置文件
ls /etc/clickhouse-server
# 该目录下config.xml主要为服务端配置
# 如数据文件路径:<path>/var/lib/clickhouse/</path>
# 还有日志文件路径:<log>/var/log/clickhouse-server/clickhouse-server.log</log>
# users.xml则主要为一些参数设置,如CPU给多少、最大内存的使用量
vim /etc/clickhouse-server/config.xml
# 把 <listen_host>::</listen_host> 的注释打开
# 这样的话才能让 ClickHouse 被除本机以外的服务器访问
- 重新启动服务
systemctl restart clickhouse-server
# 或者直接
clickhouse status # 查看状态启动
clickhouse start # 启动
- 关闭开机自启(可选,enable或者disable看你的需求)
systemctl disable clickhouse-server
- 使用client连接server
[root@9527 clickhouse]clickhouse-client -m
# -m即回车可以换行,而不是代表开始执行语句
# 此时语句的结束是封号
# 连接其他主机
[root@9527 clickhouse]clickhouse-clinet -h 主机名 -P端口 -u -p
# 还可以后面跟一个查询语句,不进去直接查结果
[root@9527 clickhouse]clickhouse-client --query ""
三、ClickHouse的数据类型
1、整型
固定长度的整型,包括有符号整型或无符号整型。
整型范围(-2^n-1~2^n-1 -1):
Int8 - [-128 : 127] # 8位,对应Java中的byte
Int16 - [-32768 : 32767] # 16位,对应Java中的short
Int32 - [-2147483648 : 2147483647]
Int64 - [-9223372036854775808 : 9223372036854775807]
无符号整型范围(0~2^n-1):
UInt8 - [0 : 255]
UInt16 - [0 : 65535]
UInt32 - [0 : 4294967295]
UInt64 - [0 : 18446744073709551615]
使用场景: 个数、数量、也可以存储型 id。
2、浮点型
Float32 - float # 32位,4字节
Float64 – doubl
使用场景:一般数据值比较小,不涉及大量的统计计算,精度要求不高的时候
3、布尔型
没有单独的类型来存储布尔值。可以使用 UInt8
类型,并将取值限制为 0 或 1。
# 无符号INT
UInt8 - [0 : 255]
4、Decimal型
有符号的浮点数,可在加、减和乘法运算过程中保持精度。有三种声明:
➢ Decimal32(s),相当于 Decimal(9-s,s),有效位数为 1~9
➢ Decimal64(s),相当于 Decimal(18-s,s),有效位数为 1~18
➢ Decimal128(s),相当于 Decimal(38-s,s),有效位数为 1~38
# s即小数位数
举例:
Decimal32(5),即整数+小数一共9位,小数部分5位
使用场景: 一般金额字段、汇率、利率等字段为了保证小数点精度,都使用 Decimal
进行存储。
6、枚举类型
包括 Enum8 和 Enum16 类型。Enum 保存 'string'= integer 的对应关系。
Enum8 用 'String'= Int8 对描述。
Enum16 用 'String'= Int16 对描述。
创建一个表,其中x列是枚举类型
# 列名x
# 类型 Enum8('hello' = 1, 'world' = 2)
CREATE TABLE t_enum
(
x Enum8('hello' = 1, 'world' = 2)
)
ENGINE = TinyLog;
这个枚举类型保存了两个String和和Int的对应关系。这个 x 列只能存储类型定义中列出的值:‘hello’或’world’
INSERT INTO t_enum
VALUES ('hello'), ('world'), ('1');
存入其他的值,则报错。
INSERT INTO t_enum
VALUES ('a');
想看到String对应的INT,需做转换:
SELECT CAST(x ,'INT8') FROM t_enum;
使用场景:对一些状态、类型的字段算是一种空间优化
,也算是一种数据约束
。但是实际使用中往往因为一些数据内容的变化增加一定的维护成本,甚至是数据丢失问题。
7、时间类型
目前 ClickHouse 有三种时间类型
➢ Date
接受年-月-日的字符串比如 ‘2019-12-16’
➢ Datetime
接受年-月-日 时:分:秒的字符串比如 ‘2019-12-16 20:50:10’
➢ Datetime64
接受年-月-日 时:分:秒.亚秒的字符串比如‘2019-12-16 20:50:10.66’
8、数组
Array(T):由 T 类型元素组成的数组
。T 可以是任意类型,也可以套一个数组类型。 但不推荐使用多维数组,ClickHouse 对多维数组的支持有限。
- 创建数组的方式1:使用array函数
# toTypeName(x) 函数,获取当前字段的类型
# array(1, 2) AS x即1、2两个数字放这个数组里,起名x
SELECT array(1, 2) AS x, toTypeName(x) ;
SELECT array(1,2,'hahhahaha' AS x,toTypeName(x);
# 这种数组里类型不统一的,就会报错
DB::Exception:There is no supertype for types UInt8,String....
- 创建数组的方式2:使用方括号
SELECT [1, 2] AS x, toTypeName(x);
![Logo](https://devpress.csdnimg.cn/79de2bf0b7994defa4242ef90d5513fa.jpg)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)