一款OLAP数据库ClickHouse

本篇主题:基于3W1H原则,讲解ClickHouse,以便于后续开发实践。

中文文档:如何使用 ClickHouse 测试您的硬件 | ClickHouse Docs

1 clickhouse是什么?

ClickHouse 是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),使用C++语言编写,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。

tips:

OLTP(on-line transaction processing)翻译为联机事务处理, OLAP(On-Line Analytical Processing)翻译为联机分析处理,从字面上来看OLTP是做事务处理,OLAP是做分析处理。从对数据库操作来看,OLTP主要是对数据的增删改,OLAP是对数据的查询。

1.1 Why we choose it

1.1.1 经典架构及分析

架构分析

  • 数据的实效性,中间过程经过Kafka、ETL、调度处理,报表的实效性不理想
  • 即席分析性能,Hive存储是hdfs文件系统,查询效率不高,不适合即席查询
  • 涉及Hadoop组件多
  • 数据链路长,数据链路处理流程长,繁琐容错也不好

1.1.2 为啥选择ClickHouse

  1. ClickHouse独立于hadoop生态之外,开源的OLAP数据库
  2. 支持海量数据,实时导入,适合在线查询,多维 聚合分析
  3. 真正的面向列的DBMS,SQL语法支持
  4. 简单、开箱即用
  5. 主主架构,支持线性扩展
  6. 其他原因,请看下方特性

1.2 clickhouse特点

1、完备的DBMS功能

ClickHouse拥有完备的管理功能,所以它称得上是一个DBMS(Database Management System,数据库管理系统),而不仅是一个数据库。作为一个DBMS,它具备了一些基本功能,如下所示。

  • DDL(数据定义语言):可以动态地创建、修改或删除数据库、表和视图,而无须重启服务。
  • DML(数据操作语言):可以动态查询、插入、修改或删除数据。
  • 权限控制:可以按照用户粒度设置数据库或者表的操作权限,保障数据的安全性。
  • 数据备份与恢复:提供了数据备份导出与导入恢复机制,满足生产环境的要求。
  • 分布式管理:提供集群模式,能够自动管理多个数据库节点。

这里只列举了一些最具代表性的功能,但已然足以表明为什么Click House称得上是DBMS了。

2、列式存储与数据压缩

列式存储和数据压缩,对于一款高性能数据库来说是必不可少的特性。一个非常流行的观点认为,如果你想让查询变得更快,最简单且有效的方法是减少数据扫描范围和数据传输时的大小,而列式存储和数据压缩就可以帮助我们实现上述两点。列式存储和数据压缩通常是伴生的,因为一般来说列式存储是数据压缩的前提。

列式存储相比于行式存储,列式存储在分析场景下有着许多优良的特性。

  • 分析场景中往往需要读大量行但是少数几个列。

在行存模式下,数据按行连续存储,所有列的数据都存储在一个block中,不参与计算的列在IO时也要全部读出,读取操作被严重放大。

列存模式下,只需要读取参与计算的列即可,极大的减低了IO cost,加速了查询。

  • 同一列中的数据属于同一类型,压缩效果显著,压缩比高。

列存往往有着高达十倍甚至更高的压缩比,节省了大量的存储空间,降低了存储成本。

更高的压缩比意味着更小的data size,从磁盘中读取相应数据耗时更短。

  • 自由的压缩算法选择。clickhouse默认使用LZ4算法压缩,数据总体的压缩比可以达到8:1。
    不同列的数据具有不同的数据类型,适用的压缩算法也就不尽相同。可以针对不同列类型,选择最合适的压缩算法。
  • 高压缩比,意味着同等大小的内存能够存放更多数据,系统cache效果更好。

官方显示,通过列存储,在某些分析场景下,能获得100倍甚至更高的加速效果。

3、向量化执行引擎

clickhouse不仅将数据按列存储,而且按列进行计算。传统的OLTP数据库通常采用按行计算,原因是事务处理中以点查为主,SQL计算量小,实现这些技术的收益不够明显,单个SQL所涉及计算量可能极大,将每行作为一个基本单元进行处理会带来严重的性能损耗:

1)对每一行数据都要调用相应的函数,函数调用开销占比高;

2)存储层按列存储数据,在内存中按列组织,但是计算层按行处理,无法充分利用CPU Cache的预读能力,造成CPU Cache miss严重;

3)按行处理,无法利用高效的SIMD指令

ClickHouse实现了向量化执行引擎(Vectorized execution engine),对内存中的列式数据,一个batch调用一次SIMD指令(而非每一行调用一次),不仅减少函数调用次数,降低Cache miss,而且可以充分发挥SIMD指令的并行能力,大幅度缩短了计算耗时。向量执行引擎,通常能够带

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值