一文了解Clickhouse

2023-11-19

ClickHouse是什么

ClickHouse是一个存储计算一体的工具,其与spark,flink等大数据框架不同的在于它有自己的存储层,在数据压缩,存储上做了更多的优化,所以导致它在某些数据处理能力上比其他工具上了不少,毕竟一般框架只是在计算层面上下功夫做优化。

为什么选择ClickHouse

ClickHouse有非常多的特点,但这里我只选择我认为比较重要的说:

  • 灵活多变:分析场景下,随着业务变化要及时调整分析维度、挖掘方法,以尽快发现数据价值、更新业务指标。而数据仓库中通常存储着海量的历史数据,调整代价十分高昂。预先建模技术虽然可以在特定场景中加速计算,但是无法满足业务灵活多变的发展需求,维护成本过高。
  • 存储优化:首先与普通数据库存储不同在于,它采用列式存储,分析场景中往往需要读大量行但是少数几个列。在行存模式下,数据按行连续存储,所有列的数据都存储在一个block中,不参与计算的列在IO时也要全部读出,读取操作被严重放大。而列存模式下,只需要读取参与计算的列即可,极大的减低了IO cost,加速了查询。其次因为采用了列式存储一列数据的类型一般都是一样的,所以在数据压缩上,效果更好,这样就可以将数据存储空间压缩的更小,可以存更多的数据,也意味着可以在内存中放更多的数据,那么速度自然就更快。上述存储优化前提都是基于采用其merge tree为引擎的,它还有其他引擎应对特殊情况,比如integrations引擎可以获取外部数据等等
  • 计算快:ClickHouse将数据划分为多个partition,每个partition再进一步划分为多个index granularity,然后通过多个CPU核心分别处理其中的一部分来实现并行数据处理。除了优秀的单机并行处理能力,ClickHouse还提供了可线性拓展的分布式计算能力。ClickHouse会自动将查询拆解为多个task下发到集群中,然后进行多机并行处理,最后把结果汇聚到一起。ClickHouse不仅将数据按列存储,而且按列进行计算。ClickHouse实现了向量执行引擎,对内存中的列式数据,一个batch调用一次SIMD指令(而非每一行调用一次),不仅减少了函数调用次数、降低了cache miss,而且可以充分发挥SIMD指令的并行能力,大幅缩短了计算耗时。向量执行引擎,通常能够带来数倍的性能提升。

image-20220505115641422

ClickHouse怎么读写

ClickHouse数据写入时直接落盘,同时也就省略了传统的写redo日志阶段。ClickHouse是依赖于ZooKeeper做异步的磁盘文件同步.

ClickHouse存储中的最小单位是DataPart,一次批量写入的数据会落盘成一个DataPart。DataPart内部的数据存储是完全有序的状态(按照表定义的order by排序),这种有序存储就是一种默认聚簇索引可以用来加速数据扫描。ClickHouse也会对DataPart进行异步合并,

其合并也是用来解决两个问题:

1)让数据存储更加有序;

2)完成主键数据变更。

DataPart在合并存储数据时表现出的是merge-sorted的方式,合并后产生的DataPart仍然处于完全有序状态。

高吞吐写入能力

ClickHouse采用类LSM Tree的结构,数据写入后定期在后台Compaction。通过类LSM tree的结构,ClickHouse在数据导入时全部是顺序append写,写入后数据段不可更改,在后台compaction时也是多个段merge sort后顺序写回磁盘。顺序写的特性,充分利用了磁盘的吞吐能力,即便在HDD上也有着优异的写入性能。

官方公开benchmark测试显示能够达到50MB-200MB/s的写入吞吐能力,按照每行100Byte估算,大约相当于50W-200W条/s的写入速度。

2.png

关于clickhouse的读能力,首先关乎到其计算能力,clickhouse的计算引擎特点则是极致的向量化,完全用c++模板手写的向量化函数和aggregator算子使得它在聚合查询上的处理性能达到了极致。配合上存储极致的并行扫描能力,轻松就可以把机器资源跑满。

ClickHouse是完全列式的存储计算引擎,而且是以有序存储为核心,在查询扫描数据的过程中,首先会根据存储的有序性、列存块统计信息、分区键等信息推断出需要扫描的列存块,然后进行并行的数据扫描,像表达式计算、聚合算子都是在正规的计算引擎中处理。从计算引擎到数据扫描,数据流转都是以列存块为单位,高度向量化的。

ClickHouse,只有一个面向IO的UnCompressedBlockCache和系统的PageCache,ClickHouse立足于分析查询场景,分析场景下的数据和查询都是多变的,查询结果等Cache都不容易命中,所以ClickHouse的做法是始终围绕磁盘数据,具备良好的IO Cache能力。

clickhouse的分布式系统每台机器都是相对独立了可以去做查询,同时可以任意扩展副本到服务器上。

image-20220505105853288

在读数据时,它会分发子查询给各个机器,然后汇总进行查询

image-20220505113308609

ClickHouse是否支持大数据量

clickhouse的存储就决定了其支持海量数据,具体存储过程如下图:

image-20220505112048264

需要注意的是稀疏主键索引就是,它将每列数据按照index granularity(默认8192行)进行划分(分成图中的block),每个index granularity的开头第一行被称为一个mark行。(这里有点像操作系统中虚拟内存的页表那种概念,也就是图中的.mrk)主键索引存储该mark行对应的primary key的值。对于where条件中含有primary key的查询,通过对主键索引进行二分查找,能够直接定位到对应的index granularity,避免了全表扫描从而加速查询。

ClickHouse的主键索引与MySQL等数据库不同,它并不用于去重

ClickHouse是否支持定时淘汰

可以前提是使用merge-tree表引擎

数据Partitioning

ClickHouse支持PARTITION BY子句,在建表时可以指定按照任意合法表达式进行数据分区操作,比如通过toYYYYMM()将数据按月进行分区、toMonday()将数据按照周几进行分区、对Enum类型的列直接每种取值作为一个分区等。

数据Partition在ClickHouse中主要有两方面应用:

  • 在partition key上进行分区裁剪,只查询必要的数据。灵活的partition expression设置,使得可以根据SQL Pattern进行分区设置,最大化的贴合业务特点。
  • 对partition进行TTL管理,淘汰过期的分区数据。

数据TTL

在分析场景中,数据的价值随着时间流逝而不断降低,多数业务出于成本考虑只会保留最近几个月的数据,ClickHouse通过TTL提供了数据生命周期管理的能力。

ClickHouse支持几种不同粒度的TTL:

1) 列级别TTL:当一列中的部分数据过期后,会被替换成默认值;当全列数据都过期后,会删除该列。

2)行级别TTL:当某一行过期后,会直接删除该行。

3)分区级别TTL:当分区过期后,会直接删除该分区。

在建表的时候可以自定义TTL时间:

image-20220505112011614

ClickHouse的优势、劣势

高性能读取

  • 数据有序存储:任意表达式SORTBY,灵活适应业务

  • 稀疏索引:Block级别、任意表达式、多种索引类型

高吞吐写入

  • LSMtree:200MB/S

  • 线性拓展:P2P架构、多点可写

  • 多种Sharding策略:rand/任意表达式hash/自定义比例

  • 支持Delete/Update高压缩比

  • 列存:定长存储、词典编码

  • 列级压缩算法、丰富的编码算法

高可用存储

  • 任意副本数量

  • Multi-Master多点可写、多点可查、双向同步

  • 不同shard支持不同副本数

image-20220505112315482

分析场景下(where过滤后的记录数较多),ClickHouse凭借极致的列存和向量化计算会有更加出色的并发表现。

ClickHouse并发处理能力立足于磁盘吞吐

ClickHouse更加适合低成本、大数据量的分析场景,它能够充分利用磁盘的带宽能力。

有一个弊端就是对于单条查询使用多cpu,就不利于同时并发多条查询。所以对于高 qps 的查询业务,ClickHouse 并不是强项。

ClickHouse测试对比

关于ck和mysql,hive的测试对比

image-20220429095410296

https://clickhouse.com/benchmark/dbms/#[100000000,[%22ClickHouse%22,%22Hive%22,%22MySQL%22],[%221%22,%222%22]]

ClickHouse同类对比Doris,Hologres

doris是百度开源的,其基于内存计算速度更快,holo是阿里配套的解决方案,可以直接基于maxcompute存储,同时支持列存储和行存储,更加灵活,但同行吐槽在flink读kafka写入holo,用flink消费holo的binglog场景性能可能没那么高,clickhouse是性价比较高,它尽可能的去压榨服务器的资源。

阅读相关文章:
官方文档:https://clickhouse.com/docs/zh

微信ck实时数仓实践:https://baijiahao.baidu.com/s?id=1717387409459384676&wfr=spider&for=pc

深入理解什么是LSM-Tree:https://blog.csdn.net/u010454030/article/details/90414063

clickhouse和Elasticsearch的对比:https://developer.aliyun.com/article/783804?spm=5176.20128342.J_6302206100.2.27137ba2a3mxh2&groupCode=clickhouse

details/90414063

clickhouse和Elasticsearch的对比:https://developer.aliyun.com/article/783804?spm=5176.20128342.J_6302206100.2.27137ba2a3mxh2&groupCode=clickhouse

clickhouse表引擎简介:https://developer.aliyun.com/article/762461?spm=5176.20128342.J_6302206100.3.27137ba2a3mxh2&groupCode=clickhouse

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一文了解Clickhouse 的相关文章

随机推荐

  • Android studio 3.0+ 为模拟器导入图片

    问题 很多时候 写一个 App 的 Demo 需要加载本地图片 但是模拟器直接打开会发现 图库中是空的 这时候就需要我们手动向里面添加图片 在 Android 3 0 以前 通过 DDMS 很轻松的把图片拖进去就是了 但是 在 Androi
  • 西门子PLC各个通信协议解析,分析

    1 协议分类 0 协议背景介绍1 1 mpi接口 dp接口 rs485接口 rs232接口具体区别 一 mpi接口 dp接口 这两者均为基于RS485接口 可以理解为硬件标准 mpi与dp是通信协议的名称 可以理解为软件 二 MPI MPI
  • Linux下Qt可执行程序设置动态库及插件路径

    在linux下直接双击编译完的可执行程序发现压根跑不起来 但是在Qt Creator中能够执行和调试 那是因为可执行程序无法加载Qt的库导致的 下面提供一种解决办法 新建run sh 名称可随意修改 将以下内容写入文件中 bin bash
  • 【直观详解】什么是正则化

    转自 https charlesliuyx github io 2017 10 03 E3 80 90 E7 9B B4 E8 A7 82 E8 AF A6 E8 A7 A3 E3 80 91 E4 BB 80 E4 B9 88 E6 98
  • 一起学nRF51xx 9 -  pwm

    前言 上一讲我们学习了nrf51822定的器的使用 那行如何用定时器实现PWM输出呢 NRF51的time模块不支持 PWM 功能 不可我们可以通过定时器 PPI GPIOTE模块一起工作的方式在NRF51XX上产生 PWM 信号 下面以使
  • 2023华为OD机试真题【最佳植树位置/二分法】

    题目内容 小明在直线的公路上种树 现在给定可以种树的坑位的数量和位置 以及需要种多少棵树苗 问树苗之间的最小间距是多少时 可以保证种的最均匀 两棵树苗之间的最小间距最大 输入描述 输入三行 第一行一个整数 坑位的数量 第二行以空格分隔的数组
  • 2023年考证时间一览表

    2022年已经成为历史 在疫情背景全面开放下给大家整理了2023年全年的考试时间以及报名时间新鲜出炉 了解清楚 为2023年提前做好规划 1月份 2022年下半年中小学教师资格考试面试 报名时间 2022年12月9日 12日 考试时间 20
  • Java Web如何限制访问的IP的两种方法

    Java Web限制IP访问的两种方法 前一阵子因为在做项目时碰到了这个功能 现在好好总结一下 至于为什么要限制IP访问 我就不多说了 然后百度了一下 现在主要有两种方式去限制IP访问 第一种是最简单的方便的 第二种是通过过滤器来限制访问
  • vuforia模型脱卡功能的实现

    思路是这样 识别图视野脱离之后 将被识别的物体不再作为识别图的子物体 转而作为相机的子物体 并置于屏幕中央位置 1 首先 写个小script C 纯文本查看 复制代码 01
  • Mybatis/Mybatis-Plus驼峰式命名映射

    目录 一 mybatis驼峰式命名 二 mybatisPlus默认开启驼峰命名映射 一 mybatis驼峰式命名 方法一 使用前提 数据库表设计按照规范 字段名中各单词使用下划线 划分 使用好处 省去mapper xml文件中繁琐编写表字段
  • 团队梯队人才培养模型,60页人才梯队建设与人才培养

    团队梯队人才培养模型 60页人才梯队建设与人才培养 果断收藏 今日头条 人才梯队建设与人才培养 目录 1 人才梯队建设理念 2 人才梯队建设路径 3 梯队人才培养内容与方法 团队总监以上人员管理不成熟的表现 1 无法从项目运作导向转变到战略
  • yolov5 deepsort 行人/车辆(检测 +计数+跟踪+测距+测速)

    功能 简介 实现了局域的出 入 分别计数 显示检测类别 ID数量 默认是 南 北 方向检测 若要检测不同位置和方向 需要加以修改 可在 count car traffic py 点击运行 默认检测类别 行人 自行车 小汽车 摩托车 公交车
  • C++开源序列化库:FStruct

    FStruct是一个用于C 对象 结构体 STL容器等 和json xml字符串之间进行转换的库 采用非入侵方式 无需在原有结构体上进行修改 目前支持基础类型 结构体 以及vector list deque set map等复杂数据类型的序
  • 【C语言】字符串函数介绍三(strstr、strtok、streeror)

    前言 之前我们用两篇文章介绍了strlen strcpy stract strcmp strncpy strncat strncmp这些函数 第一篇文章strlen strcpy stract 第二篇文章strcmp strncpy str
  • 2019年用户流失分析(五)——Python实现

    5 模型应用 选择4月份为正常状态的电视用户 计算他们的收视时长 收视在线天数 距最近一次收视时间 入网时长 用户主动办理次数和投诉与报障次数6个特征指标 利用构建好的用户流失模型预测5月份的用户流失情况 5 1 离网倾向阈值 在4月份为正
  • ThreeJS动态加载div标签

    思路 1 在页面中创建一个div标签 2 确定标签在三维场景中的三维位置 3 计算三维位置的屏幕坐标 4 在每一帧的渲染中都计算一下这个三维坐标的屏幕位置 并把屏幕位置赋给标签 具体实现 1 创建div标签 标签样式 tap positio
  • 脑电EEG代码开源分享 【4.特征提取-频域篇】

    往期文章 希望了解更多的道友点这里 0 分享 脑机接口 人工智能 的学习之路 1 1 脑电EEG代码开源分享 1 前置准备 静息态篇 1 2 脑电EEG代码开源分享 1 前置准备 任务态篇 2 1 脑电EEG代码开源分享 2 预处理 静息态
  • Linux 文件共享(两种方法)

    一 实验目的 快速掌握Linux文件共享 共享文件夹 的两种方法 1 通过虚拟机ubuntu在 mnt hgfs下的共享文件夹映射到物理机实现 2 通过物理机的映射网络驱动器连接到虚拟机ubuntu的共享文件夹实现 二 实验环境 工具软件
  • 《算法图解》——第八章 贪婪算法

    第八章 贪婪算法 1 简单的贪婪算法 每步都采取最优的做法 每步都选择局部最优解 2 背包问题 有些情况下 完美是优秀的敌人 如果你只需要找到一个大致解决问题的算法 贪婪算法挺不错 因为实现容易 结果与正确结果相当接近 练习8 1 你在一家
  • 一文了解Clickhouse

    ClickHouse是什么 ClickHouse是一个存储计算一体的工具 其与spark flink等大数据框架不同的在于它有自己的存储层 在数据压缩 存储上做了更多的优化 所以导致它在某些数据处理能力上比其他工具快上了不少 毕竟一般框架只