当前位置: 首页 > article >正文

Clickhouse 为什么这么快

Clickhouse 的缘起

Clickhouse 最初是为 Yandex.Metrica 这个世界上第二大的Web分析平台开发的,并且一直是这个系统的核心组件。ClickHouse在Yandex.Metrica中的主要任务是使用非聚合数据在在线模式下构建报告,使用374台服务器组成的集群,在数据库中存储的数据超过20.3万亿行,压缩后的数据量约为2PB,未压缩的数据量(TSV格式)大约17PB。

Clickhouse 是一款面向数据仓库提供实时计算的产品,传统数仓普遍存在计算效率低、查询和写入延时高、投资和运维成本高等缺陷。Clickhouse 放弃了很多传统数据仓库习以为常的设计,致力于充分发挥单机性能优势,提供低成本、高效率的实时数据仓库环境。今天我们就来分析,Clickhouse 是如何通过精妙的存储引擎和计算引擎来实现这些目标的。

Clickhouse 为什么这么快

向量化的存储引擎

Clickhouse 是一款列式存储数据库。数据库表通常包含数十甚至数百的列,而分析计算只会使用其中的几个列。行存读取时将整行数据读取到内存中,然后再选择相关的列进行计算,而列式存储仅读取需要参与计算的列,因此列存能够极大的降低数据分析过程中需要读取的数据量。

而在计算引擎设计上,Clickhouse 首次使用了向量化计算引擎,借助于CPU提供的SIMD(Single Instruction Multiple Data,单指令多数据流)技术,可以充分发挥现代计算机体系架构的优势,最大限度的压榨单机性能。在实际使用中,百亿以下的单表基本上使用单机就可以处理,这种处理能力已经可以满足绝大多数企业的需求,也在很大程度上解决了传统数据仓库系统效率低和成本高的问题。

在这里插入图片描述

高比例的数据压缩

列存为Clickhouse 带来另一个非常明显的优势是大幅提高了数据压缩空间。列存是将同一列数据存储在连续的空间上,字段类型都是相同的,数据相似度更高,相比于行存数据,能够提供更高的数据压缩比,从而大幅减少压缩后的数据大小,降低磁盘的I/O时间。

实际项目中,Clickhouse 的数据压缩比能够达到8:1,即8T数据压缩后只需要1T的存储空间。Yandex.Metrica 未压缩数据17PB,压缩后2PB,压缩比也接近8:1。

高效的I/O优化

超高的压缩比例为Clickhouse 带来了更低的数据存储成本和I/O访问开销,同时也带来了额外的计算开销 – 数据解压缩。数据压缩后存储到磁盘上,访问时需要进行解压还原数据,之后才能参与分析和计算。如何最大程度减少解压时间,甚至在数据被程序读取前就过滤掉不相干的数据,成为具备压缩能力引擎的一大挑战。

Clickhouse 底层存储引擎使用MergeTree,为了应对海量数据查询和管理需求,Clickhouse 使用了一种和B树索引完全不同的索引结构 – 稀疏索引。

Clickhouse 批量数据插入形成一个最小的存储单元,称为Part,每个Part中的数据按照主键排序,表是由多个Part组成的。

ClickHouse 的表通常都比较大,因此表中的数据通常都是先按照分区键被划分为多个分区,分区键常采用日期的方式,比如下图中按照月份分区。分区表的Part归属于某一个分区,为了实现高效的数据存储,ClickHouse会在后台定期对归属于同一个分区的Part进行合并。

在这里插入图片描述

每个数据Part被逻辑上拆分为多个颗粒(granules),granules是Clickhouse访问时读取的最小数据集,不可分割。granules中的第一行用该行的主键值来标记,这个标记保存在 Part 的索引文件中,Clickhouse 会为每个granules创建独立的索引文件。不仅仅是主键,每一列都会存储类似的标记,可以通过这些标记直接在列文件中查找数据。

在这里插入图片描述

和B树索引主键和数据一一对应的结构不同,稀疏索引的数据并没有精确到行,而是通过索引文件中的Mark快速定位到数据所在的granules;然后将定位到的候选granules以并行流的方式加载到ClickHouse引擎,找到最终匹配的数据。这种索引最大的好处是主键索引占用的存储空间很小,扫描的效率也很高,非常适合海量数据分析中的范围查询。

简单举例

以下是一个简单的数据查询过程,通过这个过程我们可以了解到如何从Clickhouse中获取到最终数据。

select count(distinct action) where date=toDate(2020-01-01) and city=’bj’
  1. 查找primary.idx并找到对应的Mark集合(即数据block集合);
  2. 对于要读取的每个列根据.mrk文件定位到Mark对应在数据文件.bin中的数据offset;
  3. 读取到对应的数据,供后续计算。

Clickhouse 的不足

天下没有免费的午餐,ClickHouse在提供超强查询性能的同时,也会在其他方面做一些取舍。

  • 没有完全成熟的事务能力;
  • 对于已存在的数据,缺乏高效的数据修改和删除能力;
  • 稀疏索引使得ClickHouse在按键值检索单行的点查询时效率不高。

写在最后

任何架构都不是万能的,都有其自身的优点,在获取这些优点的同时也存在局限。尽管ClickHouse还存在着些许的不足,使得其并不适合作为OLTP型的数据库,但并不妨碍其成为优秀的MPP架构数据仓库。

国内诸如字节跳动、腾讯、携程、滴滴出行等众多头部互联网公司,都在使用ClickHouse作为分析查询引擎,提供业务决策、用户画像等场景。在当前基础架构国产化的背景下,还有一众公司基于ClickHouse推出了自己的数据仓库产品,将ClickHouse的产品和理念推广到更广阔的领域。


http://www.kler.cn/news/294627.html

相关文章:

  • 前端去除 html 的标签 v-html 改为方法
  • C++学习笔记(10)
  • “设计模式双剑合璧:工厂模式与策略模式在支付系统中的完美结合”
  • YOLOv8改进 | Conv篇 | YOLOv8引入DWR
  • 2024年,女生到底适合转行ui设计还是软件测试?
  • golang闭包中变量获取
  • 3个 ArcGIS imagery的新特性
  • ELK学习笔记(三)——使用Filebeat8.15.0收集日志
  • 美金充值卡自己收会更划算吗?相当卡商的学员看过来
  • PHP一键创建在线考试考试答题系统小程序源码助力远程教育与考核
  • 驾驭冰雪 安全无忧,韩泰高性能冬季轮胎新品上市
  • 装修找人做“私活”有哪些风险?
  • Oracle---PAG程序全局区的组成:堆栈区、会话区、游标区、排序区
  • 【debug】nvidia-smi:Failed to initialize NVML: Unknown Error
  • Redis 持久化 AOF、RDB
  • 如果文件从存储卡中被误删除,存储卡数据恢复如何恢复?
  • 【Linux】萌新看过来!一篇文章带你走进Linux世界
  • 【Qt】处理键盘事件
  • Spring-容器:IOC-基于注解管理Bean
  • C++11 --- 智能指针
  • 自然语言处理系列五十》文本分类算法》SVM支持向量机算法原理
  • 超详细!!!electron-vite-vue开发桌面应用之创建新窗口以及主进程和子进程的通信监听(十二)
  • (1)DRF项目服务器部署(Linux/Nginx/Uwsgi)
  • 数据结构---双向链表(内存泄露相关知识)
  • 关于易优cms自定义字段不显示的问题
  • 梧桐数据库(WuTongDB):聚簇索引的原理、实现方法及应用场景
  • [RK3588][Android12] Android->拦截指定进程冻结,避免后台服务长时间运行被系统冻结
  • Spring全局异常处理HandlerExceptionResolver使用
  • 【网络安全基础】网络安全的基本概念与威胁
  • Python批量提取pdf标题-作者信息