【ClickHouse】什么是ClickHouse?CK入门

一、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、官网

https://clickhouse.com/

在这里插入图片描述
这里有文档和一个在线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);

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/llg___/article/details/130808588