CLICKHOUSE文档
1.clickhouse安装(单机版简化版)
准备工作
需要硬件:虚拟机(vmware,centos7)
需要软件:安装包
下载
https://packagecloud.io/altinity/clickhouse
clickhouse-client-20.1.8.41-1.el7.x86_64.rpm
clickhouse-common-static-20.1.8.41-1.el7.x86_64.rpm
clickhouse-server-20.1.8.41-1.el7.x86_64.rpm
clickhouse-server-common-20.1.8.41-1.el7.x86_64.rpm
安装步骤
1.1 取消打开限制,扩大操作文件数
/etc/security/limits.conf
/etc/security/limits.d/90-nproc.conf
2个文件末尾加上以下2行
--同时打开文件数和进程数
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
1.2 取消selinx
vi /etc/selinux/config
将SELINUX=后面改为disable
1.3 关闭防火墙
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
systemctl status firewalld.service #查看防火墙状态
1.4安装依赖
yum install -y libtool
yum install -y *unixODBC*
--需要联网进行下载,无法联网请参考
https://www.jb51.net/article/153656.htm
1.5 安装
rpm -ivh *.rpm
1.6 启动服务,打开客户端
service clickhouse-server start --打开服务
service clickhouse-server stop --关闭服务
进入客户端
clickhouse-client
退出客户端
exit/quit
2.数据类型--常用数据类型介绍(数据类型严格区分大小写)
2.1 数字类型
数字类型分为整形和浮点型
分别为Int8/Int16/Int32/Int64/UInt8/UInt16/UIn32/UInt64 和Float32, Float64
后面的数据表示位 8位则代表2的8次方为2^8=256
则Int8的范围为-2^7~2^7-1 即-128~127 以此类推
UInt8 是正整性 范围为 0~2^8-1即0-255 以此类推
Float类似于Int
Float存在精度误差,例如1表示为0.9999999999……
能使用整形尽量避开浮点数
而且Float支持正负无穷 inf/-inf 非数字nan
例如 select 1/0 则表示为正无穷inf,反之亦然
Select 0/0 则结果为nan
2.2字符串类型
字符串类型为String 和FixedString(N)
String类似于java 无长度限制
FixedString 后面的N是字符串长度,适用于长度有约束的场景
2.3时间类型
时间字段为 Date 和DateTime 一个是yyyyMMdd格式 一个是yyyyMMddHHmmss格式且不能相通
2.4 枚举类型(可用来代替boolean)
此数据库无boolean类型,3.1将示范boolean的代替用法
枚举类型,clickhouse种没有boolean类型,可以用枚举类型来代替
且只支持 String=Int类型
3 表引擎
表引擎 |
TinyLog |
Memory |
Merge |
MergeTree |
存储位置 |
磁盘 |
内存(服务器重启数据消失) |
本身不存数据 |
|
优点 |
存储小 |
速度快(每秒10G) |
merge其他的表, |
指定主键排序, |
缺点 |
不支持索引 |
不支持索引 |
|
|
3.1 TinyLog
最常规的表数据
create table test_zk(aaa Int8)engine=TinyLog;
insert into test_zk values(200);--类似于JAVA种Int超出范围
insert into test_zk values(100);
select * from test_zk; -56
枚举实现boolean
create table enum(boo Enum('true'=1,'false'=0))engine=TinyLog;
insert into enum values('true'),('false');
只能放true或者false 现实boolean
3.2 Memory
存放于内存种,重启之后数据消失,速度快
--Memory
create table test_zk1(aaa String)engine=Memory;
insert into test_zk1 values('100');
insert into test_zk1 values('200');
select * from test_zk1;
3.3 Merge
本身不存数据
整合其他表的数据
Merge表引擎还有2个参数
create table test_merge(aaa String)engine=Merge(currentDatabase(),'^test');
或
create table test_merge(aaa String)engine=Merge(currentDatabase(),'test_zk1');
2个参数
第一个选择数据库,可以写函数当前数据库,也可以写数据库名
第二个正则,选择所有符合正则的表,创建之后选择匹配上表里面的数据
前提是数据字段相同
3.4 MergeTree
--按照主键排序
--自动合并数据(存储合并,实际数据不会丢失)
--有分区功能
--支持数据冗余备份
--支持数据采样 limit的形式
--聚合数据,将相近的数据进行存储上的聚合(分区字段/主键),实际数据不聚合
--支持多副本性,类似于HDFS
create table mergetree_table (
id UInt8,
partition_date Date,
name String)
engine=MergeTree()
partition by partition_date
order by (id,name);
--自动触发合并
insert into mergetree_table values(1,'2019-01-01','A');
insert into mergetree_table values(2,'2019-01-02','B');
insert into mergetree_table values(3,'2019-01-03','C');
3.5 ReplacingMergeTree
--去重重复项(主键),只会在触发mergetree合并的时候触发
--指定VAR列保留此列最大的,否则保留最新的一条
每隔一段时间会进行聚合也可手动刷新
create table repmergetree_table (
id UInt8,
partition_date Date,
name String,
point UInt8)
engine=ReplacingMergeTree(point)
partition by partition_date
order by (id,name);
insert into repmergetree_table values(1,'2019-01-01','A',1);
insert into repmergetree_table values(1,'2019-01-01','A',2);
insert into repmergetree_table values(1,'2019-01-01','A',3);
insert into repmergetree_table values(1,'2019-01-01','A',4);
insert into repmergetree_table values(1,'2019-01-01','A',5);
insert into repmergetree_table values(1,'2019-01-01','A',6);
--optimize table repmergetree_table 自动刷新表
3.6 SummingMergeTree
--相同KEY(主键)的数据(指定字段)会累加
create table summergetree_table (
id UInt8,
partition_date Date,
name String,
sum UInt8,
not_sum UInt8)
engine=SummingMergeTree(sum)
partition by partition_date
order by (id,name);
insert into summergetree_table values(1,'2019-01-01','A',1,1);
insert into summergetree_table values(1,'2019-01-01','A',2,2);
insert into summergetree_table values(1,'2019-01-01','A',3,3);
insert into summergetree_table values(1,'2019-01-01','A',4,4);
insert into summergetree_table values(1,'2019-01-01','A',5,5);
insert into summergetree_table values(1,'2019-01-01','A',6,6);
optimize table summergetree_table;
每隔一段时间会进行聚合也可手动刷新
3.7 Distributed分布式引擎
--合并其他机器上的表(同一个表)
--Distributed(cluster_name,database,table,[分片字段可选参数])
--分片字段是用来区分插入字段的
create table dis_table
(id UInt8,
name String)
engine=Distributed(clickhouse_cluster,default,t)
分布式表其实可以看成是一个视图
3.8 ReplicatedMergeTree复制表引擎
CREATE TABLE metro.metro_mdw_pcg (
storekey Int32,
custkey Int32,
cardholderkey Int32,
pcg_main_cat_id Int32,
pcg_main_cat_desc String,
count Int32,
quartly String
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/metro/metro_mdw_pcg', '{replica}') PARTITION BY (quartly, pcg_main_cat_id)
ORDER BY (storekey, custkey, cardholderkey)
第一个参数是ZK路径,必须一致,第二个参数是副本名称,必须不一杨,后面的参数就是主键和排序一类的参数了
复制表机制就仅仅只是提供一种副本机制。属于同一个分片服务的不同复制表之间会相互同步数据。
4 工具使用
目前我们使用的最多的windows端的工具为DBeaver
下载地址
安装后连接
如果连接不上,找到 /etc/clickhouse-server/config.xml文件
将里面的<listen_host>::</listen_host>注释取消掉重启服务即可
5 使用注意事项以及技巧
使用clickhouse最重要的一点是语言严格区分大小写
1,关闭虚拟内存,物理内存和虚拟内存的数据交换,会导致查询变慢。
2,为每一个账户添加join_use_nulls配置,左表中的一条记录在右表中不存在,右表的相应字段会返回该字段相应数据类型的默认值,而不是标准SQL中的Null值。
3,JOIN操作时一定要把数据量小的表放在右边,ClickHouse中无论是Left Join 、Right Join还是Inner Join永远都是拿着右表中的每一条记录到左表中查找该记录是否存在,所以右表必须是小表。
4,批量写入数据时,必须控制每个批次的数据中涉及到的分区的数量,在写入之前最好对需要导入的数据进行排序。无序的数据或者涉及的分区太多,会导致ClickHouse无法及时对新导入的数据进行合并,从而影响查询性能。
5,尽量减少JOIN时的左右表的数据量,必要时可以提前对某张表进行聚合操作,减少数据条数。有些时候,先GROUP BY再JOIN比先JOIN再GROUP BY查询时间更短。
6,ClickHouse的分布式表性能性价比不如物理表高,建表分区字段值不宜过多,防止数据导入过程磁盘可能会被打满。
7,CPU一般在50%左右会出现查询波动,达到70%会出现大范围的查询超时,CPU是最关键的指标,要非常关注。