当前位置: 首页 > news >正文

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

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.lryc.cn/news/158290.html

相关文章:

  • Android 使用Camera2 API 和 GLSurfaceView实现相机预览
  • 说说IO多路复用
  • mysql 锁解决的办法
  • C++零碎记录(五)
  • 玩转Mysql系列 - 第16篇:变量详解
  • Windows云服务器 PHP搭建网站外网无法访问的问题
  • TuyaOS Sensor Hub组件介绍
  • 【实战】React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(总结展望篇)
  • Leetcode.321 拼接最大数
  • 数学建模竞赛常用代码总结-PythonMatlab
  • 在Ubuntu上安装CUDA和cuDNN以及验证安装步骤
  • SecureCRT ssh链接服务器
  • linux之perf(3)top实时性能
  • 【linux命令讲解大全】076.pgrep命令:查找和列出符合条件的进程ID
  • 微信小程序开发---条件渲染和列表渲染
  • 【ES6】require、export和import的用法
  • Vue + Element UI 前端篇(九):接口格式定义
  • 部署Django报错-requires SQLite 3.8.3 or higher
  • 什么是网络存储服务器
  • lv3 嵌入式开发-10 NFS服务器搭建及使用
  • 后流量时代的跨境风口:Facebook广告
  • Java基础学习笔记-2
  • Mongodb 安装脚本(附服务器自启动)
  • yolov5的pytorch配置
  • ISO 19712-1-2008装饰用实体面材检测
  • 华为OD机试 - 最多颜色的车辆 - 数据结构map(Java 2022Q4 100分)
  • Mybatis 插入、修改、删除
  • 2023年9月DAMA-CDGA/CDGP数据治理认证火热招生中
  • 【SpringCloudAlibaba】Seata分布式事务使用
  • Java-day13(IO流)