ClickHouse解析

一 什么是ClickHouse?

ClickHouse是一个快速开源的OLAP数据库管理系统,它是面向列的,允许使用SQL查询实时生成分析报告。

OLAP全称是On-Line Analytical Processing,是一种联机分析处理数据库,一般用于数据仓库或者大数据分 析处理,这种类型的数据库在事务能力上很弱,但是在分析的场景下很强大。

列式数据库的优势:

1.针对分析类查询,通常只需要读取表的一小部分列,减少io消耗

2.由于数据总是打包成批量读取的,所以压缩是非常容易的。同时数据按列分别存储这也更容易压缩。这进一步 降低了I/O的体积。

3.由于I/O的降低,这将帮助更多的数据被系统缓存

二 ClickHouse的特性

1、真正的列式数据库管理系统

2、优秀的数据压缩能力

3、数据的磁盘存储,降低设备预算

4、多核心并行处理,ClickHouse会使用服务器上一切可用的资源,从而以最自然的方式并行处理大型查询。

5、多服务器分布式处理

6、支持SQL,降低学习成本

7、向量引擎,数据不仅仅按列存储,同时还按向量(列的一部分)进行处理,这样可以更加高效地使用CPU。

8、实时的数据更新,数据可以持续不断地高效的写入到表中,并且写入的过程中不会存在任何加锁的行为。

9、索引,按照主键对数据进行排序,这将帮助ClickHouse在几十毫秒以内完成对数据特定值或范围的查找。

10、适合在线查询

11、支持近似计算

12、自适应的join算法,JOIN多个表,它更倾向于散列连接算法,如果有多个大表,则使用合并-连接算法。

13、支持数据复制和数据完整性

14、角色的访问控制。

三 ClickHouse的缺点在于:

1、没有完整的事务支持。

2、缺少高频率,低延迟的修改或删除已存在数据的能力。仅能用于批量删除或修改数据。

3、ClickHouse不适合通过检索单行的点查询

四 ClickHouse核心概念

4.1 表引擎(Engine)

表引擎决定了数据在文件系统中的存储方式,常用的也是官方推荐的存储引擎是MergeTree系列,如果需要数据副本的话可以使用ReplicatedMergeTree系列,相当于MergeTree的副本版本。读取集群数据需要使用分布式表引擎Distribute。

4.2.表分区(Partition)

表中的数据可以按照指定的字段分区存储,每个分区在文件系统中都是都以目录的形式存在。常用时间字段作为分区字段,数据量大的表可以按照小时分区,数据量小的表可以在按照天分区或者月分区,查询时,使用分区字段作为Where条件,可以有效的过滤掉大量非结果集数据。

4.3.分片(Shard)

一个分片本身就是ClickHouse一个实例节点,分片的本质就是为了提高查询效率,将一份全量的数据分成多份(片),从而降低单节点的数据扫描数量,提高查询性能。

4.4. 复制集(Replication)

简单理解就是相同的数据备份,在CK中通过复制集,我们实现保障了数据可靠性外,也通过多副本的方式,增加了CK查询的并发能力。这里一般有2种方式: (1)基于ZooKeeper的表复制方式; (2)基于Cluster的复制方式。由于我们推荐的数据写入方式本地表写入,禁止分布式表写入,所以我们的复制表只考虑ZooKeeper的表复制方案。

4.5.集群(Cluster)

可以使用多个ClickHouse实例组成一个集群,并统一对外提供服务。

五 主要表引擎解析

5.1.TinyLog

最简单的表引擎,用于将数据存储在磁盘上,每列都存储在单独的压缩文件中,写入时,数据附加到文件末尾. 缺点:(1)没有并发控制(没有做优化,同时写会数据会损坏,报错) (2)不支持索引 (3)数据存储在磁盘上 优点:(1)小表节省空间 (2)数据写入,只查询,不做增删改操作 

create table stu(id Int8, name String)ENGINE=TinyLog //创建表

5.2. Memory

内存引擎,数据以未压缩的原始形式直接保存在内存中,服务器重启,数据会消失,读写操作不会相互阻塞,不支持索引。 建议上限1亿行的场景。 优点:简单查询下有非常高的性能表现(超过10G/s) 

create table stu(id Int8, name String)ENGINE=Merge(db_name, 'regex_tablename') //创建表

5.3.Merge

本身不存储数据,但可用于同时从任意多个其他的表中读取数据,读是自动并行的,不支持写入,读取时,那些真正被读取到数据的表的索引(如果有的话)会被占用,默认是本地表,不能跨机器。 参数:一个数据库名和一个用于匹配表名的正则表达式

create table stu1(id Int8, name String)ENGINE=TinyLog
create table stu2(id Int8, name String)ENGINE=TinyLog
create table stu3(id Int8, name String)ENGINE=TinyLog
create table stut (id UInt16, name String)ENGINE=Merge(currentDatabase(), ‘^t’)

5.4.MergeTree

ck中最强大的表引擎MergeTree(合并树)和该系列(*MergeTree)中的其他引擎。 使用场景:有巨量数据要插入到表中,高效一批批写入数据片段,并希望这些数据片段在后台按照一定规则合并。相比在插入时不断修改(重写)数据进行存储,会高效很多。 优点:(1)数据按主键排序 (2)可以使用分区(如果指定了主键)(3)支持数据副本 (4)支持数据采样

//创建表:
CREATE TABLE mt_table
(
`date` Date,
`id` UInt8,
`name` String
)
ENGINE = MergeTree          //指定引擎
PARTITION BY toYYYYMM(date) //分区键,这里是按月分区 
PRIMARY KEY(id)             //主键,提供了数据的一级索引,但是却不是唯一约束 ,因为MergeTree 采用的是稀疏索引
ORDER BY id                 //排序键,设定了分区的数据按照哪些字段顺序进行有序保存。是MergeTree中的唯一一个必填项  要求主键必须是order by字段的前缀字段
5.4.1跳数索引

跳数索引可在建表的时候指定,创建语句如下:

INDEX index_name expr TYPE type(...) GRANULARITY granularity_value

expr可以是元组,表示创建多个同类的跳数索引。一旦创建了跳数索引,在分区文件中就会出现skpi_idx_[Column].idx 和 skip_idx_[Column].mrk 文件。例如创建名称分别为a和b的minmax、set跳数索引:

//创建表:
CREATE TABLE table_name
(
    u64 UInt64,
    i32 Int32,
    s String,
    ...
    INDEX a (u64 * i32, s) TYPE minmax GRANULARITY 3,
    INDEX b (u64 * length(s)) TYPE set(1000) GRANULARITY 4
) ENGINE = MergeTree()
...
5.4.2 TTL

TTL即Time To Live ,MergeTree提供了可以管理数据表或者列的生命周期的功能

用法: TTL time_col + INTERVAL 3 DAY

表示数据存活时间是time_col时间的3天后

INTERVAL可以设定的时间:SECOND MINUTE HOUR DAY WEEK MONTH QUARTER YEAR

数据TTL:

//创建表:
create table stu(
	id UInt32,
	sku_id String,
	total_amount Decimal(16,2) TTL create_time+interval 10 SECOND, 
	create_time Datetime
)engine = MergeTree
partition by toYYYYMMDD(create_time)
primary key(id)
order by (id,sku_id)

create_time 字段不能为主键,且必须为日期格式

表级TTL:

//创建表:
create table tt1_table_v2 (
id String,
create_time DateTime,
code String TTL create_time + INTERVAL 10 SECOND,
type UInt8
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(create_time)
ORDER BY create_time
TTL create_time + INTERVAL 1 DAY;  //数据会在1天后消失


ALTER TABLE tt1_table_v1 MODIFY TTL create_time + INTERVAL + 3 DAY;  //将TTL更改为3天

5.5 ReplacingMergeTree

在MergeTree的基础上,增加了“处理重复数据”的功能,和MergeTree的不同之处在于他会删除具有相同主键的重复项,数据的去重只会在合并的过程中出现,合并会在未知的时间在后台进行,所以你无法预先做出计划,有一些数据可能仍未被处理,适用于在后台清除重复的数据以节省空间,但是不保证没有重复的数据出现。

//创建表:
create table tablename(
date Data,
id UInt8,
name String,
point Uint8
)
ENGINE = ReplacingMergeTree(point)
partition by date
order by (id,name);

5.6 SummingMergeTree

继承自MergeTree,区别在于,当合并SummingMergeTree表的数据片段时,ck会把具有相同主键的行合并为一行,该行包含了被合并的行中具有数值数据类型的列的汇总值,如果主键的组合方式使得单个键值对应于大量的行,则可以显著的减少存储空间并加快数据查询的速度,对于不可加的列,会取一个最先出现的值。

5.7 Distributed(重点)

分布式引擎,本身不存储数据,但可以在多个服务器上进行分布式查询,读是自动并行的,读取时,远程服务器的索引(如果有的话)会被使用。

//cluster name    - 服务器配置文件中的集群名,在/etc/metrrika.xml中配置
//database    -数据库名
//table     -表名
//sharding key    -数据分片键

案例演示:

1.在hadoop01,hadoop02,hadoop03上分别创建一个表t

create table t(id UInt16,name String) ENGINE=TinyLog;

2.在3台机器的t表中插入一些数据

insert into t (id,name) values (1,'jack');
insert into t (id,name) values (2,'luck');

3.在hadoop01上创建分布式表

create table dis table(
id UInt16,
name String) 
ENGINE=Distributed(clickhouse_cluster ,default ,t ,id)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值