列式存储ClickHouse(一)概述
这里写目录标题
- 概述
- 优势特性
- 缺点特性
- 性能
- 安装
- 测试
- 创建表
- 导入数据
- 查询数据
ClickHouse,是一个快速,开源,OLAP的数据库管理系统。ClickHouse是列式存储的,支持实时使用SQL的查询生成分析报告。
什么场景下使用ClickHouse
分析干净,结构合理且不可变的事件或日志流。 建议将每个这样的流放入具有预连接维度的单个宽事实表中。特别是以下场景:
- 网络和应用分析
- 广告网络和实时出价
- 电信
- 电子商务和金融
- 信息安全
- 监控和遥测
- 时间序列
- 商业智能
- 网络游戏
- 物联网
概述
优势特性
- 真正的面向列的存储
不存储额外的数据,支持恒定长度存储。其他系统也可以列式存储,但是他们侧重点不同,无法有效处理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-clientsudo 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 E0C56BD4echo "deb https://repo.clickhouse.tech/deb/stable/ main/" | sudo tee \/etc/apt/sources.list.d/clickhouse.list
sudo apt-get updatesudo apt-get install -y clickhouse-server clickhouse-clientsudo service clickhouse start
clickhouse-client
登录之后,和MySQL终端比较像,包括DDL,DQL,DML都类似。
日志目录在
/var/log/clickhouse-server/
测试
创建表
ClickHouse中数据库和数据表的概念大多数数据库管理系统一样,数据库中有多个数据表,创建数据库test1
clickhouse-client --query "create database if not exists test1"
创建表的语法要比数据库复杂一下,包括三要素:
- 表名称
- 表结构
- 表引擎和相关设置,决定了关于这张表的查询如何物理执行的
创建名称为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 test1USE test1Ok.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 = 8192CREATE 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 = 8192Ok.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
(完)(^_^)
列式存储ClickHouse(一)概述相关推荐
- 列式存储ClickHouse(二)接口
这里写目录标题 HTTP JDBC 官方driver ClickHouse-Native-JDBC clickhouse4j Command Line MySQL Click提供了丰富的接口来访问数据 ...
- clickhouse 列式存储数据库介绍
ClickHouse介绍 ClickHouse来自哪里? 俄罗斯最大的搜索公司Yandex,在clickhouse的配置文件中我们也会看到yandex的影子. ClickHouse是什么? Click ...
- 数仓选型必列入考虑的OLAP列式数据库ClickHouse(上)
概述 定义 ClickHouse官网地址 https://clickhouse.com/ 最新版本22.4.5.9 ClickHouse官网文档地址 https://clickhouse.com/do ...
- 为什么 OLAP 需要列式存储
为什么这么设计(Why's THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点.对具体实现造成的影响 ...
- 用户关系表 存储_列式存储系列(一)CStore
作者:辛庸,阿里巴巴计算平台事业部 EMR 技术专家.Apache Hadoop,Apache Spark commiter.对 Hadoop.Spark.Hive.Druid 等大数据组件有深入研究 ...
- OLAP列式存储之引擎特性
本文简要从存储结构.索引结构和数据更新方式等几个方面介绍当前比较热门的OLAT/HATP列式存储引擎,包括ClickHouse和SqlServer. ClickHouse 1.1 存储结构和索引结构 ...
- 列式存储和行式存储它们真正的区别是什么
本文是<Column-Stores vs. Row-Stores: How Different Are They Really?>论文的读后感,作者徐明明.原文链接:https://zhu ...
- 列式存储的分布式数据库——HBase Shell与SQL实战操作(HBase Master高可用实现)
文章目录 一.前言 二.命令行操作(hbase shell) 1)连接HBase 2)创建表(create) 3)添加数据(put) 4)查询数据(scan ) 5)获取单行数据(get) 6)禁用/ ...
- 列式存储和行式存储有什么区别?
写在前面 本文隶属于专栏<100个问题搞定大数据理论体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见100个问题搞定大数据理 ...
最新文章
- Docker 1.13 管理命令
- [安卓] 12、开源一个基于SurfaceView的飞行射击类小游戏
- (原创)Android6.0亮屏流程之Keyguard Window绘制
- SpringSecurity简单应用(二)
- 程序固化到优盘中_将Windows 8/10 系统装进优盘
- 在函数中的局部程序(像是比局部变量还局部的部分)
- css怎么让div旋转不改变形状,旋转任意角度 如何让div旋转一定的角度
- git 理解 Head指针Branch指针--resetcheckout
- mysql = 索引_深入MySQL索引
- 新浪通行证在线申诉找回密码业务逻辑错误导致严重安全漏洞
- 远程桌面连接:使用lcx进行端口转发
- java 多线程数组越界_越界java数组
- 如何将视频的语音变成文字播放出来?
- android 修改图标颜色
- 如何利用ewomail搭建邮件服务器
- 新监管新纪元 大浪淘沙始见金——“9·4”政策回顾·行业前瞻
- mybatis-plus设置某个字段可以为空
- PostgreSQL函数——数值函数
- frame框架下子框架切换
- vue声明周期_Vue生命周期的理解
热门文章
- ubuntu中关闭防火墙
- 使用mysql++写入BLOB数据
- awk if 不包含_linux三剑客之awk
- mysql system_time_zone乱码_解决mysql设置时区时的错误Unknown or incorrect time zone: 'Asia/Shanghai'...
- 计算机机器语言与高级语言转化,机器语言与汇编语言之间是怎么转化的?
- qiankun 传统项目配置_微前端 qiankun 项目实践
- java esclient query_elasticsearch 口水篇(4)java客户端 - 原生esClient
- wimbuilder2教程_Wimbuilder WIN10XPE制作所需的工程文件
- 三层调用关系_你真正的了解MVC三层架构开发模式吗
- 雾山五行专题高清壁纸,绝美动漫场景