ClickHouse
一. ClickHouse概述
1. 什么是clickHouse?
1) SQL结构化查询语言
2) 分布式数据库
3) 存储海量资源
4) 列式存储 (切片 分区 副本)
5) 解决并发
自己管理数据,读取别人的mysql hdfs 网络 本地文件
ClickHouse是一个完全的列式存储数据库管理系统 , 主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告,
2. 选择ClickHouse的主要原因就是以为它快,为什么会快?
1) C++
2) 利用c语言和硬件的交互优势 更好的读写数据
3) 方便实时数据结构管理数据
4) 使用大量的硬件优化算法
5) 数据存储的时候是特殊数据格式,压缩
6) 使用了大量读取优化算法
7) 集群的运算资源并行处理数据 , 利用单节点的多线程运算
二. ClickHouse单击安装
1) 安装curl工具
yum install -y curl
2) 添加clickhouse的yum镜像
curl -s .rpm.sh | sudo bash
3) 检查镜像情况
[root@doit04 yum.repos.d]# yum list | grep clickhouse
clickhouse-client.x86_64 20.5.4.40-1.el7 @Altinity_clickhouse
clickhouse-common-static.x86_64 20.5.4.40-1.el7 @Altinity_clickhouse
4) 安装clickhouse的服务端和客户端
yum install -y clickhouse-server clickhouse-client
5) 启动服务daunt
service clickhouse-server start
6) 启动交互式客户端
clickhouse-client -m --m支持多行输入
7) 检验
show databases
三. 常用数据类型 数据存储的位置
1. Int8 ... int256 (正负)
UInt8 Uint256 (正)
Float32 Float64 (double)
String
Date
DateTime
2. 数据存储在本地的默认位置
/var/lib/clickhouse/data
[root@linux01 data]# ll
total 0
drwxr-x---. 2 clickhouse clickhouse 6 Dec 3 22:26 db_name
drwxr-x---. 5 clickhouse clickhouse 62 Dec 4 00:14 default
drwxr-x---. 2 clickhouse clickhouse 113 Dec 3 19:58 system
四. 引擎: 不同的引擎不同的存储位置和存储特点
1. 数据库引擎 engine=mysql( hdfs路径 )
2. 表引擎
1) 自己的特殊引擎
(1). Log引擎: 不支持索引 如果写入失败,则该表将被破坏 试用于临时数据
数据是以列为文件存储
插入数据的时候是想文件后面追加数据
xx.bin 列数据
size.json每个文件的大小
不支持索引
读写分离
create table `tb_user`(
id String ,
name String ,
age UInt8 ,
birthday Date
) engine = Log; --engine(引擎)= Log
-rw-r-----. 1 clickhouse clickhouse 54 Dec 3 21:58 age.bin --列数据
-rw-r-----. 1 clickhouse clickhouse 56 Dec 3 21:58 birthday.bin
-rw-r-----. 1 clickhouse clickhouse 68 Dec 3 21:58 id.bin
-rw-r-----. 1 clickhouse clickhouse 64 Dec 3 21:58 __marks.mrk --数据的块偏移量
-rw-r-----. 1 clickhouse clickhouse 69 Dec 3 21:58 name.bin
-rw-r-----. 1 clickhouse clickhouse 151 Dec 3 21:58 sizes.json -- 长度
MergerTree引擎底层存储数据以Tree基本存储结构
1) 维护节点关系; 方便分区
2) 方便CRUD(增删改查)
3) 排序 挡边索引
4) 合并(归并)
create table tb_tree1(
id String,
name String,
city String
)
engine=MergerTree; --指定引擎
order by id; --必须指定排序字段和主键,指定了排序会默认以排序字段为主键,也可自己设置-rw-r-----. 1 clickhouse clickhouse 319 Dec 4 00:13 checksums.txt --检查数据类型是否匹配
-rw-r-----. 1 clickhouse clickhouse 53 Dec 4 00:13 city.bin --数据
-rw-r-----. 1 clickhouse clickhouse 48 Dec 4 00:13 city.mrk2
-rw-r-----. 1 clickhouse clickhouse 77 Dec 4 00:13 columns.txt
-rw-r-----. 1 clickhouse clickhouse 1 Dec 4 00:13 count.txt --统计数据条数
-rw-r-----. 1 clickhouse clickhouse 61 Dec 4 00:13 id.bin
-rw-r-----. 1 clickhouse clickhouse 48 Dec 4 00:13 id.mrk2 --保存块偏移量
-rw-r-----. 1 clickhouse clickhouse 61 Dec 4 00:13 name.bin
-rw-r-----. 1 clickhouse clickhouse 48 Dec 4 00:13 name.mrk2
-rw-r-----. 1 clickhouse clickhouse 12 Dec 4 00:13 primary.idx --保存主键的索引optimize table tb_tree1 ; --表的合并
ReplacingMergeTree:它会删除具有相同主键的重复项,留下最新版本的数据,数据的去重只会在合并的
过程中出现,使用于在后台清除重复的数据以节省空间,但是不保证没有重复的数据出现
create table tb_replacing_tree2(
id String,
name String,
v UInt8
)
engine=ReplacingMergeTree(v) --指定引擎
order by id; --分组,且默认主键为id
insert into tb_replacing_tree2 values('a001','zss',10) , ('a002','lss',20); --插入数据
insert into tb_replacing_tree2 values('a001','wuu',30) , ('a002','zll',40);
optimize table tb_replacing_tree2; --合并┌─id───┬─name─┬──v─┐
│ a001 │ wuu │ 30 │
│ a002 │ zll │ 40 │
└──────┴──────┴────┘
select now(); --获取服务器的当前时间
create table tb_replacing_tree3(
id String ,
name String ,
accTime DateTime
)
engine=ReplacingMergeTree(accTime)
order by id ;
insert into tb_replacing_tree3 values('a001','zss',now());
insert into tb_replacing_tree3 values('a001','zss2',now());
optimize table tb_replacing_tree3;┌─id───┬─name─┬─────────────accTime─┐
│ a001 │ zss2 │ 2020-12-04 23:31:44 │
└──────┴──────┴─────────────────────┘
VersionedCollapsingMergeTree(标记 , 版本) 指定删除数据的版本
create table tb_versioned_collapsing_mergetree(
id UInt8,
name String,
version UInt8,
sign Int8 --标记
)
engine=VersionedCollapsingMergeTree(sign,version) --参数一标记 参数二版本
order by id ;insert into tb_versioned_collapsing_mergetree values(1,'a',1,1); --参数三版本 四标记 标记为-1合并后会被删除
insert into tb_versioned_collapsing_mergetree values(1,'a',2,-1);optimize table tb_versioned_collapsing_mergetree;
3) 集成引擎: clickhouse极易和其他数据源整合
MySQL -- 数据库引擎
create database db_ch_mysql engine=MySQL('linux01:3306' , 'hive','root','root'); --在house中连接数据库
MySQL -- 表引擎
注意: 数据库引擎 MySQL中不支持DDL
MySQL表引擎 插入数据
create table tb_user(
id Int32 ,
name String
)
engine=MySQL('linux01:3306','db_doit19','tb_user','root','root') ;SELECT *
FROM tb_user
INNER JOIN tb_user2 ON tb_user.id = tb_user2.id
┌─id─┬─name─┬─tb_user2.id─┬─tb_user2.name─┐
│ 1 │ zss │ 1 │ A │
│ 2 │ lss │ 2 │ B │
│ 3 │ ww │ 3 │ C │
└────┴──────┴─────────────┴───────────────┘
HDFS --- 表引擎
create table tb_ch_hdfs(
uid String ,
name String ,
city String ,
age UInt8
)
engine = HDFS("hdfs://linux01:8020/ch/data/*.tsv" , "TSV") ;
1 zss 北京 24
2 lss 北京 21
3 wb 上海 27
--mysql引擎表 和 hdfs引擎表 和 ch原生表 关联查询 join join
select
*
from
(select
tb_ch_hdfs.uid uid ,
tb_ch_hdfs.name hdfs_name,
tb_ch_hdfs.city hdfs_city,
tb_user2.id as id ,
tb_user2.name as ch_namefrom
tb_ch_hdfs
join
tb_user2
on
tb_ch_hdfs.uid = CAST(tb_user2.id as String))t --CAST(类似转换数据类型,也可同时使用两种型)
join
tb_user
on
tb_user.id = t.id ;