ClickHouse介绍及使用
一、clickhouse简介
ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的用于在线分析处理查询(OLAP :Online Analytical Processing)MPP架构的列式存储数据库(DBMS:Database Management System),能够使用 SQL 查询实时生成分析数据报告。ClickHouse的全称是Click Stream,Data WareHouse。
二、clickhouse的特点
列式存储:在大量的分析场景中,往往只需要读取固定的几列数据,和行存储相比节省了大量的io。同一列都是同一类型,压缩效果显著,所以能使用更少的磁盘空间,同样的空间可以缓存更多的数据。统计方面,对于列的聚合,计数,求和等统计操作优于行式存储。
三,clickhouse的安装使用
1,关闭防火墙。
2,取消打开文件数的限制,以CentOS为例在/etc/security/limits.conf 和/etc/security/limits.d/20-nproc.conf
的文件末尾加入:
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
3,安装依赖
sudo yum install -y libtool
sudo yum install -y unixODBC
4,安装包可以直接在官网下载
https://clickhouse.com
下载链接:
https://packages.clickhouse.com/rpm/stable/
以最新的21.1.19.410-2的版本为例。下载的话需要把这个四个包都下载下来。
5,安装完成更改配置
/etc/clickhouse-server/config.xml
这个配置文件里面 <listen_host>::</listen_host> 的标签是被注释掉的,需要手动打开,其他的配置例如:数据存储的路径,日志的路径设置分别在<log></log>,<path></path>的标签内。
6,关于密码设置
6.1 clickhouse的密码有2种形式,一种是明文,一种是写sha256sum的Hash值
官方不建议直接写明文密码,可以用以下命令生成密码
这样可以得到两行数据,第一行是密码明文,第二行是密码密文
PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD";
echo -n "$PASSWORD" | sha256sum | tr -d '-'
6.2 cilckhouse的配置文件默认地址 /etc/clickhouse-server
vim users.xml
找到 users --> default --> 标签下的password修改成password_sha256_hex,并把密文填进去
<password_sha256_hex>密码密文</password_sha256_hex>
6.3 添加密码后,命令行启动的方式为
clickhouse-client -h ip地址 -d default -m -u default --password 密码明文
四,clickhouse的数据类型介绍
4.1类型
基础类型:只有数值、字符串和时间三种类型,没有Boolean类型,可使用整型的0或1替代。
复合类型:数组、元组、枚举和嵌套。
特殊类型:Domain等。
4.1.1数值类型
数值类型分为整数、浮点数和定点数三类
ClickHouse直接使用Int8、Int16、Int32和Int64指代4种大小的Int类型,其末尾的数字正好表明了占用字节的大小(8位=1字节),具体信息如下表所示。
1)有符号整型Int(-2n-1~2n-1):
Int8 - [-128 : 127]
Int16 - [-32768 : 32767]
Int32 - [-2147483648 : 2147483647]
Int64 - [-9223372036854775808 : 9223372036854775807]
2)无符号整型范围UInt(0~2n-1,使用前缀U表示):
Int8 - [-128 : 127]
Int16 - [-32768 : 32767]
Int32 - [-2147483648 : 2147483647]
Int64 - [-9223372036854775808 : 9223372036854775807]
4.1.2 浮点型(Float)
与整数类似,ClickHouse直接使用Float32和Float64代表单精度浮点数以及双精度浮点数。具体如下图所示:
1)单精度浮点数:Float32 - float
2)双精度浮点数:Float64 – double
在使用浮点数的时候,应当要意识到它是有限精度的。假如,分别对Float32和Float64写入超过有效精度的数值,结果就会出现数据误差。
4.1.3 定点数
如果要求更高精度的数值运算,则需要使用定点数。ClickHouse提供了Decimal32、Decimal64和Decimal128三种精度的定点数。可以通过两种形式声明定点:简写方式有Decimal32(S)、Decimal64(S)、Decimal128(S)三种,原生方式为Decimal(P,S)。
其中:P代表精度,决定总位数(整数部分+小数部分),取值范围是1 ~38;·S代表规模,决定小数位数,取值范围是0~P。
4.2字符串
可以细分为String、FixedString和UUID三类。
String长度不限,不限定字符集,但建议遵循使用统一的编码;
FixedString,FixedString(N),使用null字节填充末尾字符;
UUID,32位,它的格式为8-4-4-4-12,空值默认用0填充,即0…0-…00
4.3时间
时间类型分为DateTime、DateTime64和Date三类。
CK目前没有时间戳类型。时间类型最高的精度是秒,即若需要处理毫秒、微秒等大于秒分辨率的时间,则只能借助UInt类型实现。
DateTimeDateTime类型包含时、分、秒信息,精确到秒,支持使用字符串形式写入。
DateTime64DateTime64可以记录亚秒,在DateTime之上增加精度设置。
DateDate类型不包含具体的时间信息,只精确到天,支持字符串形式写入。
4.4复合类型
数组、元组、枚举和嵌套
Array
有两种定义形式,以最小存储代价为原则,即使用最小可表达的数据类型
Tuple
元组类型由1~n个元素组成,每个元素之间允许设置不同的数据类型,且彼此之间不要求兼容。元组同样支持类型推断,其推断依据仍然以最小存储代价为原则
Enum
包括Enum8和Enum16两种枚举类型,Key和Value是不允许重复的,要保证唯一性。其次,Key和Value的值都不能为Null,但Key允许是空字符串。
Nested
一种嵌套表结构。一张数据表,可以定义任意多个嵌套类型字段,但每个字段的嵌套层级只支持一级,即嵌套表内不能继续使用嵌套类型。嵌套类型本质是一种多维数组的结构。嵌套表中的每个字段都是一个数组,并且行与行之间数组的长度无须对齐。在访问嵌套类型的数据时需要使用点符号。
4.5特殊类型
Nullable
并不能算是一种独立的数据类型。只能和基础类型搭配使用,也不能作为索引字段。应该慎用Nullable类型,包括Nullable的数据表,不然会使查询和写入性能变慢。因为在正常情况下,每个列字段的数据会被存储在对应的[Column].bin文件中。如果一个列字段被Nullable类型修饰后,会额外生成一个[Column].null.bin文件专门保存它的Null值。即在读取和写入数据时,需要一倍的额外文件操作。
Domain
域名类型,分为IPv4和IPv6两类,本质上是对整型和字符串的进一步封装。IPv4类型基于UInt32封装的,IPv6类型是基于FixedString(16)封装。如果需要返回IP的字符串形式,则需要显式调用IPv4NumToString或IPv6NumToString函数进行转换。
五,clickhouse的主要引擎
clickhouse的引擎可以分为数据库引擎和表引擎
1. 数据库引擎
1.1 Mysql
MySQL引擎用于将远程的MySQL服务器中的表映射到ClickHouse中,并允许对表进行INSERT和SELECT查询,以方便在ClickHouse与MySQL之间进行数据交换。
MySQL数据库引擎会将其查询语句转换为MySQL语法并发送到MySQL服务器中,因此可以执行诸如SHOW TABLES或SHOW CREATE TABLE之类的操作。
但无法对其执行以下操作:
RENAME
CREATE TABLE
ALTER
1.2 延时引擎Lazy
在距最近一次访问间隔expiration_time_in_seconds时间段内,将表保存在内存中,仅适用于 *Log引擎表。由于针对这类表的访问间隔较长,对保存大量小的 *Log引擎表进行了优化。
1.3 Atomic
它支持非阻塞 DROP 和 RENAME TABLE 查询以及原子 EXCHANGE TABLES t1 AND t2 查询。默认情况下使用Atomic数据库引擎。
2. 表引擎
表引擎(即表的类型)决定了:
数据的存储方式和位置,数据写到哪里以及从哪里读取数据:
1.支持哪些查询以及如何支持。
2.并发数据访问。
3.索引的使用(如果存在)。
4.是否可以执行多线程请求。
5.数据复制参数。
Clickhouse 中最强大的表引擎当属 MergeTree 引擎及该系列(*MergeTree)中的其他引擎。MergeTree 系列的引擎被设计用于插入极大量的数据到一张表中。数据可以以数据片段的形式一个接着一个快速写入,数据片段在后台按照一定的规则进行合并。相比在插入时不断修改(重写)已存储的数据,这种策略会高效很多。
主要特点:
存储的数据按主键排序:这使得能够创建一个小型的稀疏索引来加快数据检索
如果指定了 partitioning key 的话,可以使用分区:在相同数据集和相同结果集的情况下 ClickHouse 中某些带分区的操作会比普通操作更快。查询中指定了分区键时 ClickHouse 会自动截取分区数据。这也有效增加了查询性能。
支持数据副本:ReplicatedMergeTree 系列的表提供了数据副本功能。
支持数据采样:需要的话,您可以给表设置一个采样方法。
MergeTree Family包含多种引擎:
- MergeTree
- ReplacingMergeTree
- SummingMergeTree
- AggregatingMergeTree
- CollapsingMergeTree
- VersionedCollapsingMergeTree
- GraphiteMergeTree
每个引擎都有各自的功能和特点,具体大家可以在https://clickhouse.com/docs/zh/engines/table-engines/
官网上查看具体的参数和用法。