clickhouse入门使用

时间:2024-05-23 22:17:09

                            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)
(上限大概1E条)

merge其他的表,
2个参数数据库和匹配表名

指定主键排序,
可以分区,
支持数据副本,
支持数据采样(limit),
自动聚合数据

缺点

不支持索引

不支持索引

 

 

 

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端的工具为DBeaverclickhouse入门使用

 

下载地址

https://dbeaver.io/download/

安装后连接

clickhouse入门使用

clickhouse入门使用

如果连接不上,找到 /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是最关键的指标,要非常关注。