列式存储ClickHouse(一)概述


ClickHouse,是一个快速,开源,OLAP的数据库管理系统。ClickHouse是列式存储的,支持实时使用SQL的查询生成分析报告。
什么场景下使用ClickHouse
分析干净,结构合理且不可变的事件或日志流。 建议将每个这样的流放入具有预连接维度的单个宽事实表中。特别是以下场景:

  1. 网络和应用分析
  2. 广告网络和实时出价
  3. 电信
  4. 电子商务和金融
  5. 信息安全
  6. 监控和遥测
  7. 时间序列
  8. 商业智能
  9. 网络游戏
  10. 物联网

概述

优势特性

  • 真正的面向列的存储
    不存储额外的数据,支持恒定长度存储。其他系统也可以列式存储,但是他们侧重点不同,无法有效处理OLAP分析查询,包括HBase,BigTable,Cassandra和HyperTable。这些系统支持每秒10W行的吞吐量,但是ClickHouse支持每秒亿行的吞吐量。而且Clickhouse还是一个数据库管理系统,支持运行时创建数据库和数据表,运行时加载数据、执行查询,不需要重新配置和启动服务器。
  • 数据压缩
    部分列式存储数据库不使用数据压缩。但是数据压缩在提升性能方便有很大空间,除了通用的权衡磁盘空间和CPU消耗的编码解码其外,ClickHouse还对于特定的数据类型提供了专门的压缩解码器。
  • 磁盘存储
    通过按照主键对数据进行物理排序,提高在查询特殊值或者某一值区间时的效率,通常小于几十毫秒。某些面向列的数据库只能在RAM中工作,需要更多的成本,Clickhouse多数在常规的磁盘上工作,成本较低;但是ClickHouse也可以充分利用SSD和额外的RAM。
  • 多核并行处理
    执行数据量大的查询时,自动并行查询,占用当前服务器上所有可用的、必须要使用资源。
  • 多台服务器上分布式处理
    大多数列式存储的RDBMS都不支持分布式查询处理,ClickHouse支持分片,数据可以存在ClickHouse不同的分片上,每个分片都是可以用于容错的一组副本,所有分片都可以并行执行查询。
  • 支持标准SQL
    ClickHouse支持基于声明式查询语言的SQL,和ANSI SQL标准相同。支持 group By,order By,from,join子句,in运算符和标量子查询中的子查询。
    -**向量计算引擎 **
    数据不仅按照列存储,而且通过向量进行处理,从而实现较高的cpu效率。
  • 实时数据更新
    Click House支持表主键,为了在主键的某一范围内进行快速查询,使用Merge Tree对数据进行增量排序,因此可以将数据增量的添加到表中,提取数据时不进行任何锁定。
  • 主键索引
    通过主键对数据进行物理排序,可以在提取特定值,特定范围内的值的数据时,将时间优化到几十毫秒的量级。
  • 二级索引
    与其他数据库不同,ClickHouse的二级索引不指向特定行或行范围。而是,通过二级索引,ClickHouse知道某些数据部分的所有行不符合查询过滤条件,然后根本不读取这些数据,所以ClickHouse的二级索引又叫数据跳过索引。
  • 适用于在线查询
    大多数的OLAP数据库的初衷都不是亚秒级别的在线查询,在替代系统中认为,数十秒或者几分钟的报告构建时间是可以接受的。有时甚至需要强制离线准备报告。而ClickHouse支持压秒级别的报告查询。
  • 支持近似计算
    ClickHouse提供了多种方式来提高性能,包括近似计算。Aggregate function用来计算不重复值,中位数,分位数的数量。根据部分样本数据运行结果来计算近似结果,在这种情况下,从磁盘读取数据的比例将大大减少,对有限的随机数据执行聚合,而不是所有数据,在确定条件下数据在整个数据中的分布,会在使用较少资源的情况下得到一个合理准确的结果。
  • 自适应连接表算法
    在需要表连接时,ClickHouse自适应的选择表的连接算法,包括hash-join算法,如果有多个打标则退回merge-join算法
  • 数据复制和数据完整性支持
    ClickHouse使用异步多主节点复制,在数据写入任何可用的副本后,所有其余的副本在后台同步数据,系统在不同的副本上维护相同的数据,大多数故障发生后的恢复是自动执行的,或者在复杂情况下半自动执行恢复。
  • 基于角色的访问控制
    ClickHouse使用SQL查询管理用户账户,并允许基于角色的访问控制,类似于ANSI SQL标准和流行的关系数据库管理系统中可以找到的配置。

缺点特性

  • 没有成熟的事务支持
  • 缺乏以高速率低延迟插入数据的能力。有批量删除和更新可用于清理和修改数据,以符合GDPR
  • 稀疏索引使得ClickHouse不能有效的通过主键去查询单行数据

性能

根据Yandex内部测试结果,在同类型系统中可以比较的操作场景中ClickHouse展现出了最佳性能(包括高吞吐量的长查询,低延迟的短查询)。


单个大查询的吞吐量
吞吐量可以以每秒的行数和每秒的兆字节数衡量,如果数据在页面缓存中,一个不是太复杂的查询,在现在硬件设备上,单节点数据未压缩的情况下,执行的速率大概为2G——10G每秒(对于最简单的情况可以达到30G每秒)。如果没有将数据放在缓存中,则速率取决于磁盘和数据压缩率,例如如果磁盘子系统允许以400M每秒读取数据,且压缩率为3,则预期速度为1.2G每秒。要获得以每秒行数为单位的速率,则以每秒字节数为单位的速率除以查询中使用的列的字节数总和。例如,提取10个字节,则速度有望达到100-200w行每秒。
对于分布式处理,处理速率以线性增加,但前提是聚合和排序得到的行数不太大。


处理大量端查询是的吞吐量
在相同条件下,ClockHouse可以在一台服务器上处理每秒处理数百个短查询(最佳情况下上千个),由于这种情况在数据分析型的DBMS中并不常见,因此建议每秒最多100个查询。


插入数据性能
建议数据插入,一次传输至少1000行、或每秒一个请求的数据包中。从制表符分隔的数据转储插入到MergeTree表时,插入可以为50MB—200MB每秒。如果插入的行大小约为1KB,则速度位每秒5w至20w行。如果行很小,每秒的行数可以更高。为了提高性能,可以并行进行多个Insert查询,这些查询可以线性扩展。

安装

CentOS

sudo yum install yum-utils
sudo rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG
sudo yum-config-manager --add-repo https://repo.clickhouse.tech/rpm/clickhouse.repo
sudo yum install clickhouse-server clickhouse-client

sudo clickhouse start
clickhouse-client

Ubantu & Debian

sudo apt-get install apt-transport-https ca-certificates dirmngr
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E0C56BD4

echo "deb https://repo.clickhouse.tech/deb/stable/ main/" | sudo tee \
    /etc/apt/sources.list.d/clickhouse.list
sudo apt-get update

sudo apt-get install -y clickhouse-server clickhouse-client

sudo service clickhouse start
clickhouse-client

登录之后,和MySQL终端比较像,包括DDL,DQL,DML都类似。
日志目录在

/var/log/clickhouse-server/

测试

创建表

ClickHouse中数据库和数据表的概念大多数数据库管理系统一样,数据库中有多个数据表,创建数据库test1

clickhouse-client --query "create database if not exists test1"

创建表的语法要比数据库复杂一下,包括三要素:

  1. 表名称
  2. 表结构
  3. 表引擎和相关设置,决定了关于这张表的查询如何物理执行的
    创建名称为events的表,指定存储引擎为 MergeTree
[root@localhost ~]# clickhouse-client
ClickHouse client version 20.10.3.30 (official build).
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 20.10.3 revision 54441.

localhost :) use test1

USE test1

Ok.

0 rows in set. Elapsed: 0.001 sec. 

localhost :) CREATE TABLE test1.events(id UInt64,status UInt8,eventDate Date,summary String,description String,userId UInt64)ENGINE = MergeTree() PARTITION BY toYYYYMM(eventDate) ORDER BY (eventDate, intHash32(userId)) SAMPLE BY intHash32(userId) SETTINGS index_granularity = 8192

CREATE TABLE test1.events
(
    `id` UInt64,
    `status` UInt8,
    `eventDate` Date,
    `summary` String,
    `description` String,
    `userId` UInt64
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(eventDate)
ORDER BY (eventDate, intHash32(userId))
SAMPLE BY intHash32(userId)
SETTINGS index_granularity = 8192

Ok.

0 rows in set. Elapsed: 0.056 sec.

在上面的导入语句中使用了 MergeTree 存储引擎。

导入数据

数据导入到ClickHouse使用插入语句,像其他SQL数据库一样。但是,数据通常以某种支持的数据提供,代替SQL语句中的vlues语法
下面使用制表符分隔的数据,通过控制台客户端导入到ClickHouse
插入数据如下

1	1	2020-10-11	西安	违法停车	1001
2	1	2020-09-01	北京	闯红灯	1002
3	2	2020-10-12	上海	超速50%	1003
4	2	2020-10-20	大连	占用应急车道	1004
5	1	2020-09-30	深圳	逆行	1002

执行插入语句

clickhouse-client --query "insert into test1.events format TSV" --max_insert_block_size=100000 < e

ClickHouse客户端有许多需要调整的设置,如我们在导入数据的时候指定–max_insert_block_size=100000,查看默认设置可以查询system.setting表,包括没有设置的缺省值,如

[root@localhost ~]# clickhouse-client --query "select name,value,changed,description from system.settings where name like '%max_insert_block%' "
max_insert_block_size	1048545	0	The maximum block size for insertion, if we control the creation of blocks for insertion.

可以在导入后优化表,使用MergeTree引擎的表会在后台合并数据部分优化数据存储,下面这个语句促使引擎立即进行优化,而不是稍后

clickhouse-client --query "OPTIMIZE TABLE test1.events FINAL"

查询数据

例如查询每月发生的次数,如下图。

[root@localhost ~]# clickhouse-client --query "select count(1),toMonth(eventDate) as month from test1.events group by month format TSV"
2	9
3	10

(完)(^_^)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值