【大数据之Kafka】九、Kafka Broker之文件存储及高效读写数据

news/2024/10/17 22:24:15/

1 文件存储

1.1 文件存储机制

  Topic是逻辑上的概念,而partition是物理上的概念每个partition对应于一个log文件,该log文件中存储的是Producer生产的数据。

  Producer生产的数据会被不断追加到该log文件末端,为防止log文件过大导致数据定位效率低下,Kafka采取了分片和索引机制,将每个partition分为多个segment

  每个segment包括:“.index”文件、“.log”文件和.timeindex等文件。这些文件位于一个文件夹下。
  文件夹的命名规则为:topic名称+分区序号,例如:first-0。
在这里插入图片描述
topic数据存储位置:
(1)启动生产者并发送消息。

bin/kafka-console-producer.sh --bootstrap-server hadoop102:9092,hadoop103:9092 --topic first
> hello

(2)查看hadoop102的/opt/module/kafka/datas/first-0路径上的文件。
在这里插入图片描述
(3)通过工具查看 index 和 log 信息。

kafka-run-class.sh kafka.tools.DumpLogSegments --files ./00000000000000000000.index

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
日志参数配置:
在这里插入图片描述

1.2 文件清理策略

Kafka 中默认的日志保存时间为 7 天,通过调整如下参数修改保存时间:
在这里插入图片描述
日志超时时,Kafka 中提供的日志清理策略有 delete 和 compact 两种。
(1)delete 日志删除:将过期数据删除。
在这里插入图片描述
  (i)基于时间:默认打开。以 segment 中所有记录中的最大时间戳作为该文件时间戳。
  (ii)基于大小:默认关闭。超过设置的所有日志总大小,删除最早的 segment。 log.retention.bytes,默认等于-1,表示无穷大。
在这里插入图片描述
  因为以 segment 中所有记录中的最大时间戳作为该文件时间戳。所以对于002.timeindex文件,一个 segment 中有一部分数据过期,一部分没有过期,此时文件的命名为未过期的数据的时间戳,该时间未过期,所以保留该文件。

(2)compact 日志压缩:对于相同key的不同value值,只保留最后一个版本。
在这里插入图片描述
在这里插入图片描述
  压缩后的offset可能是不连续的,比如上图中没有6,当从这些offset消费消息时,将会拿到比这个offset大的offset对应的消息,实际上会拿到offset为7的消息,并从这个位置开始消费。

  这种策略只适合特殊场景,比如消息的key是用户ID,value是用户的资料,通过这种压缩策略,整个消息集里就保存了所有用户最新的资料。例如一个人的19岁数据可以覆盖18岁数据。

2 高效读写数据

(1)Kafka 本身是分布式集群,可以采用分区技术,并行度高.
(2)读数据采用稀疏索引,可以快速定位要消费的数据
(3)顺序写磁盘
  Kafka 的 producer 生产数据,要写入到 log 文件中,写的过程是一直追加到文件末端,为顺序写。
  顺序写能够减少大量的磁头寻址时间。
(4)页缓存 + 零拷贝技术

零拷贝:Kafka的数据加工处理操作交由Kafka生产者和Kafka消费者处理。Kafka Broker应用层不关心存储的数据,所以就不用走应用层,传输效率高。

PageCache页缓存: Kafka重度依赖底层操作系统提供的PageCache功能。当上层有写操作时, 操作系统只是将数据写入 PageCache。当读操作发生时,先从PageCache中查找,如果找不到,再去磁盘中读取。实际上PageCache是把尽可能多的空闲内存都当做了磁盘缓存来使用。
在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/1095859.html

相关文章

晨启,MSP430开发板,51开发板,原理图,PCB图

下载:https://github.com/xddun/blog_code_search

PHP反序列化漏洞

一、序列化,反序列化 序列化:将php对象压缩并按照一定格式转换成字符串过程反序列化:从字符串转换回php对象的过程目的:为了方便php对象的传输和存储 seriallize() 传入参数为php对象,序列化成字符串 unseriali…

Golang开发--interface的使用

在Go语言中,接口(interface)是一种特殊的类型,它定义了一组方法的集合。接口为实现多态性提供了一种机制,允许不同的数据类型实现相同的方法,从而可以以统一的方式处理这些不同类型的对象。接口在Go中广泛用…

《TCP/IP网络编程》阅读笔记--域名及网络地址

目录 1--域名系统 2--域名与 IP 地址的转换 2-1--利用域名来获取 IP 地址 2-2--利用 IP 地址获取域名 3--代码实例 3-1--gethostbyname() 3-2--gethostbyaddr() 1--域名系统 域名系统(Domain Name System,DNS)是对 IP 地址和域名进行相…

校园二手物品交易系统微信小程序设计

系统简介 本网最大的特点就功能全面,结构简单,角色功能明确。其不同角色实现以下基本功能。 服务端 后台首页:可以直接跳转到后台首页。 用户信息管理:管理所有申请通过的用户。 商品信息管理:管理校园二手物品中…

正则表达式使用总结

一、字符匹配 普通字符:普通字符按照字面意义进行匹配,例如匹配字母 "a" 将匹配到文本中的 "a" 字符。 元字符:元字符具有特殊的含义,例如 \d 匹配任意数字字符,\w 匹配任意字母数字字符&#xf…

【高阶产品策略】设计有效的AB测试

文章目录 1、A/B测试概述2、A/B测试实施过程3、A/B测试中需要注意的地方4、从一个案例中看A/B测试 1、A/B测试概述 2、A/B测试实施过程 3、A/B测试中需要注意的地方 4、从一个案例中看A/B测试

winform性能内存泄露检测工具

在WinForms应用程序中检测内存泄漏是非常重要的,因为内存泄漏可能会导致应用程序性能下降或崩溃。以下是一些可以帮助你检测WinForms应用程序中内存泄漏的工具和方法: 1. **Visual Studio内存分析器**: - Visual Studio自带了内存分析器工…