学习(mianshi)必备-ClickHouse高性能查询/写入和常见注意事项(五)

news2024/12/22 12:56:45

目录

一、ClickHouse高性能查询原因-稀疏索引

 二、ClickHouse高性能写入-LSM-Tree存储结构

什么是LSM-Tree

 三、ClickHouse的常见注意事项和异常问题排查


一、ClickHouse高性能查询原因-稀疏索引

密集索引:

在密集索引中,数据库中的每个键值都有一个索引记录,可以加快搜索速度,但需要更多空间来存储索引记录本身,索引记录包含键值和指向磁盘上实际记录的指针。

 mysql中Innodb引擎的主键就是密集索引

稀疏索引:

在稀疏索引中,不会为每个关键字创建索引记录,而是为数据记录文件的每个存储块设一个键-指针对,存储块意味着块内存储单元连续

 案例:

Mysql的MyISAM引擎里面, 使用均为稀疏索引;

Mysql的Innodb引擎里面,如果有主键,则主键为密集索引

Kafka里面的索引文件也是采用稀疏索引进行构造消息索引

ClickHouse的合并树MergeTree引擎是稀疏索引,默认index_granularity设置8192,新版本的提供了自适应粒度大小的特性

建表语句最后加这个,可以调整
SETTINGS index_granularity = 8192

结论:

ClickHouse一级索引就是【稀疏索引】,可以大幅减少索引占用的空间

默认的索引力度8192,假如1亿行数据只需要存储12208行索引,占用空间小,clickhouse中一级索引的数据是常驻内存的,取用速度极快
稀疏索引所占空间小,并且插入和删除时所需维护的开销也小,缺点是速度比密集索引慢一点
密集索引空间占用多,比稀疏索引更快的定位一条记录,缺点就是会占用较多的空间

不变思想:时间换空间、空间换时间

 二、ClickHouse高性能写入-LSM-Tree存储结构

先明白一个测试数据:
磁盘顺序读写和随机读写的性能差距大概是1千到5千倍之间

连续 I/O 顺序读写,磁头几乎不用换道,或者换道的时间很短,性能很高,比如0.03 * 2000 MB /s
随机 I/O 随机读写,会导致磁头不停地换道,造成效率的极大降低,0.03MB/s
 

ClickHouse中的MergeTree也是类LSM树的思想,所以我们也需要了解LSM树

充分利用了磁盘顺序写的特性,实现高吞吐写能力,数据写入后定期在后台Compaction
在数据导入时全部是顺序append写,在后台合并时也是多个段merge sort后顺序写回磁盘
官方公开benchmark测试显示能够达到50MB-200MB/s的写入吞吐能力,按照每行100Byte估算,大约相当于50W-200W条/s的写入速度


什么是LSM-Tree

全称 Log-Structured Merge-Tree 日志结构合并树,但不是树,而是利用磁盘顺序读写能力,实现一个多层读写的存储结构

是一种分层,有序,面向磁盘的数据结构,核心思想是利用了磁盘批量的顺序写要远比随机写性能高出很多
大大提升了数据的写入能力,但会牺牲部分读取性能为代价
HBase、LevelDB、ClickHouse这些NoSQL存储都是采用的类LSM树结构
在 NoSQL 系统里非常常见,基本已经成为必选方案, 为了解决快速读写的问题去设计的

可以分两个部分理解

Log-Structured日志结构的,打印日志是一行行往下写,不需要更改,只需要在后边追加就好了
Merge-tree ,合并就是把多个合成一个,自上而下

LSM-tree 是一个多层结构,就更一个喷泉树一样,上小下大

专门为 key-value 存储系统设计的,最主要的就两个个功能

写入put(k,v)
查找 get(k)得到v
首先是内存的 C0 层,保存了所有最近写入的 (k,v),这个内存结构是有序的,且可以随时原地更新,同时支持随时查询

接下去的 C1 到 Ck 层都在磁盘上,每一层都是一个有序的存储结构

降低一点读性能,通过牺牲小部分读性能,换来高性能写

 写入流程:

put 操作,首先追加到写前日志(Write Ahead Log),然后加到C0 层
当 C0 层的数据达到一定大小,就把 C0 层 和 C1 层合并,这个过程就是Compaction(合并)
合并出来的新的C1 会顺序写磁盘,替换掉原来的C1
当 C1 层达到一定大小,会和下层继续合并,合并后删除旧的,留下新的

查询流程:

最新的数据在 C0 层,最老的数据在 Cn 层
查询也是先查 C0 层,如果没有要查的数据,再查 C1,逐层查下去直到最后一层

缺点:

读放大:
读取数据时实际读取的数据量大于真正的数据量,在LSM树中需要先在C0查看当前key是否存在,不存在继续从Cn层中寻找

写放大:
写入数据时实际写入的数据量大于真正的数据量,在LSM树中写入时可能触发Compact操作,导致实际写入的数据量远大于该key的数据量 

 三、ClickHouse的常见注意事项和异常问题排查

注意点一:
查询要使用的列,避免select * 全部字段,浪费IO资源


注意点二:
避免大量的小批量数据,插入更新操作,会导致分区过多
每次插入1条,产生了一个分区,大量写入产生大量临时分区和合并操作浪费资源


注意点三:
JOIN操作时一定要把数据量小的表放在右边,无论是Left Join 、Right Join还是Inner Join,右表中的每一条记录到左表中查找该记录是否存在,所以右表必须是小表


注意点四:
批量写入数据时,控制每个批次的数据中涉及到的分区的数量,无序的数据导致涉及的分区太多,建议写入之前最好对需要导入的数据进行排序


注意点五:
写入分布式表还是本地表? 建议:数据量不大,写入本地表和分布式表都行
分布式表不存储数据,本地表存储数据的表

大量数据,日新增500万行以上,分布式表在写入时会在本地节点生成临时数据,会产生写放大,所以会对CPU及内存造成一些额外消耗,服务器merge的工作量增加, 导致写入速度变慢;

数据写入默认是异步的(可以开启同步写但性能会影响),先在分布式表所在的机器进行落盘, 然后异步的发送到本地表所在机器进行存储,中间没有一致性的校验,短时间内可能造成不一致,且如果分布式表所在机器时如果机器出现down机, 会存在数据丢失风险。

建议大数据量尽量少使用分布式表进行写操作,可以根据业务规则均衡的写入本地表;
  
必须用的话尽量只用读,因为写分布式表对性能影响非常大


注意点六:
单sql查询可以压榨CPU ,但并发多条查询则不是很强
一个分区查询占据一个CPU,业务需要查询表的多个分区可以多个CPU并行处理


注意点七:
没有完整的事务支持,不支持Transaction
OLAP类业务由于数据量非常大,建议数据批量写入,尽量避免数据更新或少更新


注意点八:
在分布式模式下,ClickHouse会将数据分为多个分片,并且分布到不同节点上,有哪种分片策略

ClickHouse提供了丰富的sharding策略,让业务可以根据实际需求选用

random随机分片:写入数据会被随机分发到分布式集群中的某个节点上
constant固定分片:写入数据会被分发到固定一个节点上
hash column value分片:按照某一列的值进行hash分片


常见异常问题:
错误码 300,Too many parts
写入频率过快,使用了不合理的分区键导致总的 part 数目太多,直接拿精确到秒的 timestamp 来作为分区键来进行分区,GG了。
错误码252,Too many partitions for single INSERT block (more than 100),同一批次写入里包括大于100个分区值,clickhouse认为这样会存在性能问题

让数据是按照天/小时分区的,一批数据里的日期跨度为一年,单次插入可能产生365个分区,导致后台异步合并数据出现问题,也避免跨度过大

解决方案:单批次写入数据,要控制写入分区过多

参数:max_partitions_per_insert_block 限制单个插入块中的最大分区数,默认是100
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/371093.html

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

相关文章

Amazon S3 服务15岁生日快乐!

2021年3月14日,作为第一个发布的服务,Amazon S3 服务15周岁啦!在中国文化里,15岁是个临界点,是从“舞勺之年”到“舞象之年”的过渡。相信对于 Amazon S3 和其他的云服务15周岁也将是其迎接更加美好未来的全新起点。亚…

【论文解读】如何使用1B参数的小模型吊打GPT3.5

大型语言模型 (LLM) 通过利用思维链 (CoT) 提示生成中间推理链作为推断答案的基本原理,在复杂推理上表现出了令人印象深刻的性能。 然而现有的 CoT 研究主要集中在语言模态上。 我们提出 Multimodal-CoT(多模态思维链推理模型),它…

利用steam搬砖信息差赚钱,单账号200+,小白也能轻松上手!

现在很多人在做互联网而且也赚到钱了,但还是有很多人赚不到钱,这是为什么? 这里我不得不说一个词叫做赛道,也就是选择,选择大于努力,项目本身大于一切,90%的人都觉得直播带货赚钱,但…

VSCode配置(一)Remote SSH

插件安装 Remote-SSHRemote Explorer 可以完成下面任务 连接远程服务器(支持rsa key的认证登陆),并访问文件结构可以经过中转机(跳转机)访问内网机器,进行IP穿透可以建立tunnel,将本地端口映…

弱监督论文阅读:P2BNet算法笔记

标题:Point-to-Box Network for Accurate Object Detection via Single Point Supervision 会议:ECCV2022 论文地址:https://link.springer.com/10.1007/978-3-031-20077-9_4 官方代码:http://www.github.com/ucas-vg/P2BNet 作者…

2023年网络安全竞赛——Python渗透测试PortScan.py

端口扫描Python渗透测试:需求环境可私信博主获取 任务环境说明: 服务器场景:PYsystem0041服务器场景操作系统:未知服务器场景FTP用户名:anonymous 密码:空1. 从靶机服务器的FTP上下载PortScan.py,编辑Python程序PortScan.py,实现

操作系统核心知识点整理--内存篇

操作系统核心知识点整理--内存篇按段对内存进行管理内存分区内存分页为什么需要多级页表TLB解决了多级页表什么样的缺陷?TLB缓存命中率高的原理是什么?段页结合: 为什么需要虚拟内存?虚拟地址到物理地址的转换过程段页式管理下程序如何载入内存?页面置…

NCNN Conv量化详解1

1. NCNN的Conv量化计算流程 正常的fp32计算中,一个Conv的计算流程如下: 在NCNN Conv进行Int8计算时,计算流程如下: NCNN首先将输入(bottom_blob)和权重(weight_blob)量化成INT8,在INT8下计算卷积,然后反量化到fp32,再和未量化的bias相加,得到输出(top_blob) 输入和…

学了一年Java的我,想转嵌入式了

秋名山码民的主页 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 🙏作者水平有限,如发现错误,还请私信或者评论区留言! 目录前言为啥我想去转行?如果我现在选择转硬件,我…

【华为OD机试模拟题】用 C++ 实现 - 相同字符连续出现的最大次数(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

计算机网络——问答2023自用

1、高速缓冲存储器Cache的作用? 这种局部存储器介于CPU与主存储器DRAM之间,一般由高速SRAM构成,容量小但速度快,引入它是为了减小或消除CPU与内存之间的速度差异对系统性能带来的影响 (Cache可以保存CPU刚用过或循环使…

【react storybook】从零搭建react脚手架,并使用storybook发布组件库到npm,并生成可视化UI文档

storybook成品展示开发准备开发组件写MDX文档发布文档发布组件成品展示 可视化UI文档页面: 可视化UI文档地址: https://guozia007.gitee.io/storybook-ui/?path/docs/mdx-button--default-story组件库地址: https://www.npmjs.com/pac…

Vmware虚拟机无法联通主机解决方法二

昨天在遇到了VMware 虚拟机无法联通主机,导致我在CentOS-7 搭建的伪Hadoop3 服务,无法访问管理平台,使用将网络编辑器修改为“桥接”模式解决。今天在学习HBase 时,昨天的问题又重新了,我通过SSH 工具MobaXterm 都无法…

《第一行代码》 第八章:应用手机多媒体

一&#xff0c;使用通知 第一步&#xff0c;创建项目&#xff0c;书写布局 <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"vertical"android:layout_width"match_parent"android:layout_he…

【数据结构趣味多】Map和Set

1.概念及场景 Map和set是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索的效率与其具体的实例化子类有关。 在此之前&#xff0c;我还接触过直接查询O(N)和二分查询O(logN)&#xff0c;这两个查询有很多不足之出&#xff0c;直接查询的速率太低&#xff0c;而二分查…

如何压缩RAR格式文件?

RAR是我们日常生活工作中经常用到的压缩文件格式之一&#xff0c;那么RAR文件如何压缩呢&#xff1f; 不管压缩哪种格式的压缩文件&#xff0c;我们都需要用到压缩软件。针对RAR格式&#xff0c;我们可以选择最常见的WinRAR&#xff0c;当然如果有同样适用于RAR格式的压缩软件…

不写注释就是垃圾

最近Linux6.2出来了增加了很多新的东西&#xff0c;有看点的是&#xff0c;Linux确实要可以在Apple M1上面运行了&#xff0c;这应该是一个很大的新闻&#xff0c;如果有这么稳定的硬件支持&#xff0c;那对于Linux来说相当于又打下了一大片的江山。其中关于Linux6.2的特性罗列…

cesium: 显示闪烁的点(004)

第004个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置闪烁的点。主要是介绍entity>point 相关的属性设置 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共107行)相关API参考:专栏目标示例效果 配…

一个阿里P6的说不会接口自动化测试,他不会是自己评的吧...

序 近期和一个阿里的测试工程师交流了一波&#xff0c;他竟然说我不会接口自动化测试&#xff0c;我当场就不服了我说你P6自己评级的吧&#xff0c;今天就带大家好好盘一盘接口自动化&#xff0c;本着以和大家交流如何实现高效的接口测试为出发点&#xff0c;本文包含了我在接…

27. 移除元素 26. 删除有序数组中的重复项 88. 合并两个有序数组(双指针遍历)

目录[27. 移除元素-力扣](https://leetcode.cn/problems/remove-element/description/?languageTagsc)[26. 删除有序数组中的重复项](https://leetcode.cn/problems/remove-duplicates-from-sorted-array/)[88. 合并两个有序数组](https://leetcode.cn/problems/merge-sorted-…