大数据-70 Kafka 高级特性 物理存储 日志存储 日志清理: 日志删除与日志压缩
点一下关注吧!!!非常感谢!!持续更新!!!
目前已经更新到了:
- Hadoop(已更完)
- HDFS(已更完)
- MapReduce(已更完)
- Hive(已更完)
- Flume(已更完)
- Sqoop(已更完)
- Zookeeper(已更完)
- HBase(已更完)
- Redis (已更完)
- Kafka(正在更新…)
章节内容
上节我们完成了如下内容:
- 日志索引文件
- 查看物理存储、查看详细的索引文件
- 消息偏移
- 偏移量的存储

日志清理
Kafka提供两种日志清理策略:
- 日志删除:按照一定的删除策略,将不满足条件的数据进行数据删除
- 日志压缩:针对每个消息的Key进行整合,对于有相同的Key的不同Value值,只保留最后一个版本。
- Kafka提供 log.cleanup.policy 参数进行相应设置,默认值:delete。还可以选择compact。
- 主题级别的配置是:cleanup.policy
日志删除
基于时间
日志删除任务会根据 log.retention.hours / log.retention.minutes / log.retention.ms 设定日志保留的时间节点。如果超过该设定值,就需要进行删除。默认是7天,log.retention.ms 优先级最高。
Kafka依据日志分段中最大的时间戳进行定位。首先要查询日志分段所对应的时间戳文件,查找时间索引文件中最后一个索引项,若最后一条索引项的时间戳字段大于0,则取该值,否则取最近修改时间。
为什么不直接选最近修改时间?
因为日志文件可以有意无意的被修改,并不能真实的反应日志分段的最大时间消息。
删除过程
- 从日志对象中所维护日志分段的跳跃表中移除待删除的日志分段,保证没有现成对这些日志分段进行读取操作。
- 这些日志分段上所有文件添加上 .delete 后缀。
- 交由一个 delete-file 命名的延迟任务来删除这些 .delete 为后缀的文件,延迟执行时间可以通过 file.delete.delay.ms 进行设置。
如果活跃日志分段中存在需要删除的数据?
- Kafka会切分出一个新的日志分段作为活跃的日志分段,该日志分段不删除,删除原来的日志分段。
- 先腾出地方,再删除。
基于日志大小
日志删除任务会检查当前日志的大小是否超过设定值,设定项为:log.retention.bytes。单个日志分段的大小由 log.segement.bytes 进行设定。
删除过程
- 计算需要被删除的日志总大小(当前日志大小(所有分段)减去retention值)
- 从日志文件第一个LogSegment开始查找可删除的日志分段的文件集合
- 执行删除
基于偏移量
根据日志分段的下一个日志分段的起始偏移量是否大于等于日志文件的起始偏移量,若是,则可以删除日志分段。

删除过程
- 从头开始遍历每个日志分段,日志分段1的下一个日志分段的起始偏移量为21,小于LogStartOffset,将日志分段1加入到删除队列中
- 日志分段2的下一个日志分段的起始偏移量35,小于LogStartOffset,将日志分段2加入到删除队列中
- 日志分段3的下一个日志分段的起始偏移量57,小于LogStartOffset,将日志分段3加入到删除队列中
- 日志分段4的下一个日志分段的起始偏移量71,大于LogStartOffset,则不进行删除。
日志压缩
基础概念
日志压缩是Kafka的一种机制,可以提供较为细粒度的记录保留,而不是基于粗粒度的基于时间保留。
对于具有相同Key,而数据不同,只保留最后一条数据,前面的数据在适合情况下删除。
应用场景
日志压缩特性,就实时计算来说,可以在异常容灾方面有很好的用途。
比如,我们在Spark、Flink中做实时计算时,需要在内存中维护一些数据,这些数据可能是通过聚合了一天或者一周的日志得到的,这些数据一旦由于异常(内存、网络、硬盘)崩溃了,从头开始计算是需要很长时间的。
一个比较可行的方案就是定时将内存里的数据备份到外部存储介质中,当出现崩溃时,再从外部存介质中恢复并继续计算。
使用日志压缩来替代这些外部存储有哪些优势和好处?
- Kafka即是数据源又是存储工具,可以简化技术栈,降低维护成本
- 使用外部存储介质的话,需要将存储的Key记录下来,恢复的时候再使用这些Key将数据取回,实现起来有一定的工程难度和复杂度。使用Kafka的日志压缩特性,只需要把数据写入Kafka,等异常出现恢复任务再读回内存就可以了
- Kafka对于磁盘的读写做了大量的优化工作,比如磁盘顺序读写。相对于外部存储介质没有索引查询等工作量负担,可以实现高性能。同时,Kafka的日志压缩机制可以充分利用廉价的磁盘,不用依赖昂贵的内存来处理,在性能相似的情况下,实现非常高的性价比(仅针对异常处理和容灾的场景)。
日志压缩实现细节
主题的 cleanup.policy 需要设置为:compact
Kafka后台线程会定时将Topic遍历两次:
- 记录每个Key的Hash值最后一次出现的偏移量
- 第二次检查每个Offset对应的Key是否在后面的日志中出现过,如果出现了就删除对应的日志。
日志压缩允许删除,除最后一个key外,删除先前出现的所有该Key对应的记录,在一段时间后从日志中清理以释放空间。
注意:日志压缩与Key有关,确保每个消息的Key不为Null。
压缩是在Kafka后台通过定时重新打开Segment来完成的,Segment压缩细节如下图所示:

日志压缩可以确保:
- 任何保持在日志头部以内的使用者都将看到所写的每条消息,这些消息将具有顺序偏移量。
- 可以使用Topic的min.compation.lag.ms属性来保证消息在被压缩之前必须经过的最短时间,也就是说,它为每个消息(未压缩)头部停留的时间提供下一个下限。可以使用Topic的max.compactiton.lag.ms属性来保证从收到消息符合压缩条件之间的最大延时
- 消息始终保证顺序,压缩永远不会重新排序消息,只是删除一些而已
- 消息的偏移量永远不会改变,它是日志中位置的永久标识
- 从日志开始的任何使用者将至少看到所有记录的最终状态,按记录的顺序写入。
- 另外,如果使用者在比Topic的log.cleaner.delete.retention.ms短的时间内到达日志的头部,则会看到已删除的所有的delete标记, 保留时间默认是24小时。
默认情况下,启动日志清理器,若需要启动特定Topic的日志清理,请添加特定的属性。
日志清理器配置
配置日志清理器,这里为大家总结了以下几点:
- log.cleanup.policy设置compact,Broker的配置,影响集群中所有Topic
- log.cleaner.min.compaction.lag.ms,用于防止对更新超过最小信息进行压缩,如果没有设置,除最后一个Segment之外,所有Segment都有资格进行压缩。
Kafka的日志压缩原理并不复杂,就是定时把所有的日志读取两遍,写一遍,而CPU的速度超过磁盘不是问题,只要日志的量对应的读取两遍和写入一遍的时间在接受范围内,那么它的性能就是可以接受的。
相关文章:
大数据-70 Kafka 高级特性 物理存储 日志存储 日志清理: 日志删除与日志压缩
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...
基于S7-200 SMART实现PID控制仿真实验
关键字:Matalb;S7-200 SMART;Modbus TCP;PID控制 系列文章目录 基于S7-200 SMART实现一键启停 顺序功能图——(二)设计机组延时关机程序 基于S7-200 SMART实现Modbus TCP通信 基于S7-200 SMART实现MATLAB写…...
社交及时通讯平台完整版源码,uniapp技术,可打包成app
源码简介: 全原生,从底层开始结构就完全不一样,mongodb的库,uniapp混编手端,二开难度要比视酷或者酷信容易很多。全开源,带开发文档。前端用的是uniapp技术,所以是多端合一,可以做h…...
TensorFlow和Pytorch是什么?干什么用的?
TensorFlow和Pytorch都是机器学习框架,允许用户自定义开发机器学习模型(利用已经实现好的神经网络层)。 1. 加载和预处理数据 加载数据:使用合适的库(如 Pandas、Numpy 或 TensorFlow 的数据处理 API)从文…...
采购人可否自行选择采购方式?|数智化招采系统支持多种采购方式
采购人是否有权自行确定采购方式,主要取决于采购项目的性质和规模,特别是是否达到公开招标的数额标准。 一、达到公开招标数额标准以上的项目 《中华人民共和国政府采购法实施条例》第二十三条规定:“采购人采购公开招标数额标准以上的货物…...
ubuntu dde 改为中文
在 Ubuntu Deepin Desktop Environment (DDE) 中,如果已经将系统语言设置为中文,但系统菜单仍然显示英文,可以尝试以下步骤解决: 检查语言设置:确保你的系统语言已经正确设置为中文。你可以在“系统设置”->“区域和…...
Nginx配置小细节,location和proxy_pass 斜杠/ 问题
理解nginx的配置有助于理解前后端调用的过程,这里是location与proxy_pass需要注意的点 location 不带斜杠 的是模糊匹配,例如 location /abc 可以匹配 /abc/index.html,也可以匹配 /abcd/index.html location 带斜杠的是固定匹配,…...
java 解析 PDF OFD 发票 部分文字缺失
1、pdfbox https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox 到这里用最新的版本 最近碰到发票各式各样,千奇百怪:记录其中一个 解析出来是:缺少一个通字 发票好几处都缺少文字,解析出来的是 一个 圆点 原因&…...
C/C++数字与字符串互相转换
前言: 在C/C程序中,会需要把数字与字符串做出互相转换的操作,用于实现程序想要的效果。下面将介绍多种方法实现数字与字符串互相转换。 字符串转为数字 一、利用ASCII 我们知道每个字符都有一个ASCII码,利用这一点可以将字符-0…...
[Spring] Spring AOP
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
鸿蒙 webview 实现顶部 Progress进度条
1, 先看效果 2, 直接cv代码 import web_webview from ohos.web.webview;interface PerUrl {url: string,age: number } Component export struct webviews {controller: web_webview.WebviewController new web_webview.WebviewController();ports: web_webview.WebMessageP…...
Pytest-BDD实现接口自动化测试,并附全部代码
引言 在之前的文章中简单的介绍了怎么使用Pytest-BDD进行接口测试,可以参考《pytest-bdd 行为驱动自动化测试》。本篇文章主要介绍使用Pytest-BDD实现接口自动化测试。后面的文章会介绍生成测试报告,和流程性接口测试。 feature文件 首先我们先整理好…...
Sqli-labs-master靶场--布尔盲注
目录 1、布尔盲注 2、布尔盲注的流程(以靶场less-8为例) 2.1输入id尝试是否存在注入点 2.1.1通过以上尝试,联想到可能是布尔盲注 2.2猜测数据库长度 2.3获取数据库名 2.3.1python脚本获取 代码: 获取结果为: …...
【QGroundControl二次开发】十. QT添加GStreamer视频播放同时保存
上一章介绍使用QT播放GStreamer视频流 【QGroundControl二次开发】八. QT实现播放gstreamer视频。 这章介绍如何在原有基础上保存为视频,同时保存为一个个规定大小的小视频。 先展示代码: #include <QApplication> #include <QWidget> #include <QtConcurrent…...
double类型 精度丢失的问题
前言 精度丢失的问题是在其他计算机语言中也都会出现,float和double类型的数据在执行二进制浮点运算的时候,并没有提供完全精确的结果。产生误差不在于数的大小,而是因为数的精度。 一、double进行运算时,经常出现精度丢失 0.10.2使用计算…...
C++ 重要特性探究
shared_from_this 使用分析 场景 类的成员函数需要获取指向自身的shared_ptr的时候类成员函数传递shared_ptr给其他函数或者对象的时候,目的是为了管理对象生命周期使用方法 首先类必须继承 std::enable_shared_from_this<T>必须使用 shared_from_this 获取指…...
c++_游戏_狼人杀
思路主要包括以下几个部分: 角色分配:代码中通过随机数的方式给狼人、平民、预言家和法师等角色进行分配,保证每个角色的数量和身份的随机性。 游戏进行:根据狼人、平民、预言家和法师等角色的身份,游戏进行了夜晚和白…...
MySQL——数据类型、索引的建立、数据的约束
文章目录 数据类型索引的建立普通索引唯一索引使用ALTER 命令添加和删除索引使用ALTER 命令添加和删除主键显示索引信息 数据的约束非空约束:not null,值不能为null唯一约束:unique,值不能重复主键约束:primary key外键…...
常见框架漏洞详解③!!
Apache Apache 是世界使⽤排名第⼀的 Web 服务器软件。它可以运⾏在⼏乎所有⼴泛使⽤的计算 机平台上,由于其跨平台和安全性被⼴泛使⽤,是最流⾏的 Web 服务器端软件之⼀。 apache⽬录结构: bin:存放常⽤命令⼯具,如h…...
大数据基础知识
大数据(Big Data)是指无法用传统数据处理工具和技术有效处理的大规模、复杂的数据集。大数据技术通过对这些数据进行存储、处理和分析,从中提取有价值的信息和见解。 1. 大数据的特点 大数据通常具有以下四个主要特点,被称为“4…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...
云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...
