Clickhouse 为什么这么快

news2024/9/20 20:37:41

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.coloradmin.cn/o/2095521.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器间进行文件传输-SFTPSCP一篇搞定

1.简单介绍一下 在一些特殊场景,两台服务器之间需要进行文件传输的时候,或许我们会想到FTP,这也是我们常见的实现方式,但是如果我们不能操作远程服务器,无法判断远程服务器是否安装了FTP呢,众所周知&#…

学习周报-2024.8.31

目录 摘要 Abstract 创新点总结 模型数学原理 实验设置 一、验证实验 二、对比实验 摘要 这周重新梳理出论文的三个创新点,对所提出方法进行数学原理验证,证明其可行性。重新设置了实验部分,分为验证实验和对比实验,一共四…

使用 Eigen 库中的 Kronecker 积运算

前言 在数值计算和线性代数的众多应用中,Kronecker 积(Kronecker Product)是一种常用的矩阵运算。Eigen 是一个高性能的 C 数值计算库,广泛用于科学计算和工程应用中。在 Eigen 库中,Kronecker 积运算属于不常用的扩展…

资料分析(1)

1)截三个数去做&#xff0c;属于马上进位了&#xff0c;差距小&#xff0c;1/19<10% 2)截两位数去做&#xff0c;1/18>10% 3)次位差分别是:3&#xff0c;4&#xff0c;1&#xff0c;选项差距分别是大&#xff0c;大&#xff0c;小 截尾不需要考虑数量级 算一半&#xff0…

抽奖项目技术亮点

活动是通过秒杀领取的。&#xff08;即&#xff1a;活动对应着某一商品&#xff09; 这里超卖指&#xff1a;对于一个活动它的参与量有数量限制&#xff0c;就是活动的库存&#xff0c;当活动的领取数大于活动库存总量&#xff0c;就是超卖 用户秒杀参与活动的资格&#xff08;…

一.海量数据实时分析-Doris入门和安装

前言 停了一个月又开始写文章啦&#xff0c;因为公司数据量达到了几十亿&#xff0c;老板需要做实时数据分析&#xff0c;报表看板。这么大的数据量比较好的选择是使用Doris来做&#xff0c;他可以脱离hadoop生态独立使用所以大受企业喜爱&#xff0c;也因为如此就有了这个系列…

【JavaWeb】Http请求与响应

文章目录 Http 请求与响应一、Http 请求格式1、请求行2、请求头3、请求体&#xff08;post请求才有&#xff09; 二、HttpServletRequest1、获取 请求行 信息2、获取 请求头 信息3、获取 请求参数 信息 三、Http 响应格式1、响应行2、响应头3、响应体&#xff08;正文&#xff…

AI大模型应用开发环境配置

目录 一、工具下载 1、Python官网下载 2、Pycharm官网下载 3、Streamlit官网下载 二、升级PIP &#xff08;一&#xff09;检查PIP版本 &#xff08;二&#xff09;在anaconda Prompt命令窗口输入 三、安装openai组件 四、安装streamlit组件 五、启动streamlit 一、工…

Voi滑板车公司助农扶商,着手打造流量板块

Voi滑板车公司助农扶商&#xff0c;着手打造流量板块。 吉林是粮食大省&#xff0c;是全国优质粳稻主产区&#xff0c;现阶段全省水稻年产量600多万吨&#xff08;商品量400万吨左右&#xff09;&#xff0c;占东北三省一区的24%。巍巍长白山、悠悠松江水&#xff0c;辽阔黑土…

Qt:玩转QPainter序列九(文本,文本框,填充)

前言 继续承接序列八 正文 1. drawImage系列函数 绘制图像 inline void drawImage(const QPoint &p, const QImage &image); 作用: 在指定的点 p 上绘制 QImage 图像。图像的左上角将对齐到 p 点。 inline void drawImage(int x, int y, const QImage &image,…

若依 Vue3的前后端分离系统管理 创建

RuoYi 若依官方网站 |后台管理系统|权限管理系统|快速开发框架|企业管理系统|开源框架|微服务框架|前后端分离框架|开源后台系统|RuoYi|RuoYi-Vue|RuoYi-Cloud|RuoYi框架|RuoYi开源|RuoYi视频|若依视频|RuoYi开发文档|若依开发文档|Java开源框架|Java|SpringBoot|SrpingBoot2.0…

【JPCS独立出版】第四届电气工程与计算机技术国际学术会议(ICEECT 2024,9月27-29)

第四届电气工程与计算机技术国际学术会议&#xff08;ICEECT2024&#xff09;将于9月27日-29日在哈尔滨举办。 会议主要围绕"电路与系统"、“电气工程材料”、“计算机视觉”、“计算机技术”等专业研究领域展开讨论。旨在为气工程、计算机技术等领域的专家学者及企业…

Java EE

Java EE 包含JavaSE 增加一些新的API 构建一个后端服务 网页->web服务器->java后端 web后端(javaEE)程序需要运行在服务器中的&#xff0c;这样前端才可以访问得到 服务器&#xff1a;是容器&#xff0c;是连接用户和程序之间的中间件 解释1&#xff1a;一款软件&#…

HBase 部署及shell操作

HBase 数据库 一、HBase 概述1.1 HBase 是什么HBase 的特点 二、HBase 模型及架构2.1 HBase 逻辑模型2.2 HBase 数据模型2.3 HBase 物理模型2.3.1 列簇物理模型2.3.2 Rowkey 字段排序2.3.3 Region 存储到不同节点2.3.4 Region 结构 2.4 HBase 基本架构 三、搭建 HBase 分布式集…

【Linux】线程结束

目录 线程安全和重入 死锁 STL中的容器不是线程安全的 线程安全的单例模式 自旋锁 读者写者问题 线程安全和重入 线程安全&#xff1a;多个线程并发执行同一段代码时&#xff0c;不会出现不同的&#xff08;异常的&#xff09;结果&#xff0c;我们就说线程是安全的。常见…

如何学好文件操作,快来看这篇文章(沉淀中)!!!!

文章目录 1. 为什么使用文件&#xff1f;2. 什么是文件&#xff1f;2.1 程序文件2.2 数据文件2.3 文件名 3. ⼆进制文件和文本文件&#xff1f;4. 文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开和关闭 5. ⽂件的顺序读写5.1 顺序读写函数介绍…

jQuery库

注明&#xff1a;本文参考自&#xff1a;jQuery - 白月黑羽 (byhy.net) jQuery安装 Download jQuery | jQuery下载到本地 ps: script标签中的src属性&#xff1a;表示包含要执行的代码的外部文件位置 <!DOCTYPE html> <html lang"en"><head><s…

unity游戏开放:标记物体 一目了然

Unity游戏开发:标记物体,让开发变得一目了然 “好读书&#xff0c;不求甚解&#xff1b;每有会意&#xff0c;便欣然忘食。” 本文目录&#xff1a; Unity游戏开发 Unity游戏开发:标记物体,让开发变得一目了然前言1. 什么是Tag&#xff1f;2. Unity中如何添加和管理Tag步骤1&am…

vue如何引入element-ui

2.x用element-ui 3.x用element-plus https://blog.csdn.net/weixin_41207479/article/details/127066333 引入element-ui的三种方式

点餐API接口对接的过程中需要注意哪些问题

以下是点餐 API 接口对接的一般步骤&#xff1a; 选择合适的点餐 API 服务提供商&#xff1a;市面上有不少提供点餐 API 的平台。你需要根据自身业务需求、预算、接口的稳定性和性能、技术支持等因素来综合考量选择。注册与申请&#xff1a;在选定 API 服务提供商后&#xff0…