Clickhouse 列式数据库
快,简单,yandex开源,C++编写,分析型数据库,SQL查询,列操作快,多样化引擎,高吞吐写入(LSM Tree),多版本数据(Hbase),顺序Append写,数据分区,线程级并行(单条查询能利用整机所有CPU),不适合初始存储,尽量避免join操作(不快,右表加载到内存)
1. Clickhouse 安装
- 准备工作
- 关闭防火墙
# status
systemctl status firewalld
- 取消打开文件数限制,并分发配置
/etc/security/limits.conf
/etc/security/limits.d/20-nproc.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 131072
* hard nproc 131072
ulimit -a :查看修改后的效果
- 安装依赖(三台)
yum install -y libtool
yum install -y *unixODBC
- 取消selinux,同步配置,重启生效
/etc/selinux/config
SELINUX=disabled
临时关闭
setenforce 0
- 安装Clickhouse
- 下载并安装rpm包(三台)
# rpm包安装之后的路径关系
bin/ -> /usr/bin/xxx
conf/ -> /etc/xxx
lib/ -> /var/lib/xxx
log/ -> /var/log/xxx
- 修改配置,同步配置
/etc/clickhouse-server/config.xml
<listen_host>::</listen_host>
3.启动
# 会开机自启,关闭开启命令
systemctl disable clickhouse-server
# start
systemctl start clickhouse-server
clickhouse-client -m
2. Clickhouse 数据类型
数据类型 | Clickhouse |
---|---|
整型 | Int、Nullable(Int) Int 默认是Int32 |
浮点型 | float、double |
布尔型 | 无 |
Decimal型 | Decimal(20,4)、Nullable(Decimal(20,4)) |
字符串 | String |
枚举类型 | Enum8、Enum16 |
时间类型 | Date、Datetime、 |
数组 | Array[T] |
# enum example
CREATE TABLE t_enum
(
x Enum8('hello' = 1, 'world' = 2)
)
ENGINE = TinyLog;
INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello');
select * from t_enum;
┌─x─────┐
│ hello │
│ world │
│ hello │
└───────┘
# 查看值
SELECT CAST(x, 'Int8') FROM t_enum;
# array example
SELECT array(1, 2) AS x, toTypeName(x) ;
SELECT [1, 2] AS x, toTypeName(x);
3. Clickhouse 表引擎
引擎名称大小写敏感
引擎名称 | 引擎特点 |
---|---|
TinyLog | 测试使用,列文件磁盘存储,不支持索引,无并发 |
Memory | 测试使用,内存存储 |
MergeTree | 最强大,支持索引和分区(分区字段必须为表中字段),TTL 生命周期 |
ReplacingMergeTree | MergeTree 子类,去重 |
SummingMergeTree | MergeTree 子类,针对指定列聚合操作,提供“预聚合” |
关于数据分区:任何一个批次写入时会写入零食分区,10-15min后,会合并到已有分区,可以手动合并
optimize table xxxx final;
关于主键:只提供一级索引,不同于MySQL的唯一约束
关于稀疏索引:两个相邻索引之间存在数据的间隔
关于建表order by: 必须参数,并且主键必须是 order by 字段的前缀字段
关于TTL :列的数据失效时间或者表修改失效
关于去重:只会在合并过程中出现,并且只在分区内部进行去重,所以并不能保证全局去重,唯一建:order by的字段
4. Clickhouse SQL
4.1 DML
# 1.insert
insert into table_name1 values(),()……
insert into table_name1 select xxx from table_name2
# 2.delete
alter table table_name1 delete where xxx=xxx;
truncate table table_name1;
# 3.update
alter table table_name1 update xxx=xxx where xxx=xxx;
# 4.query
## 4.1 with rollup : 从右至左去掉维度进行小计
## 4.2 with cube : 从右至左去掉维度进行小计,再从左至右去掉维度进行小计
## 4.3 with totals: 只计算合计
4.2 DDL
# table
alter table table_name1 add column New_col Type after col1;
alter table table_name1 modify column new_col_name Type;
alter table table_name1 drop column col_name;
# export data
clickhouse-client --query "select ……"> /xxx/xxx.csv
## header
clickhouse-client --query "select ……" --format CSVWithNames > /xxx/xxx.csv
# import data
???
5. Clickhouse 副本
保证数据高可用,一台ck宕机,不影响整体使用
副本只能同步数据,不能同步表结构
- 启动ZK
- 增加配置,同步配置
/etc/clickhouse-server/config.d/metrika.xml 文件名可以随便,后面指定读取
<?xml version="1.0"?>
<yandex>
<zookeeper-servers>
<node index="1">
<host>hadoop102</host>
<port>2181</port>
</node>