3.6.3 获取分区的读取偏移量
3.6.3 获取分区的读取偏移量
读取分区的偏移量涉及日志存储,这里我们先给出一些简单的结论(具体细节会在第6章详细分析):一个分区有多个片段文件(Segment),每个片段文件都包含全局有序的片段基准偏移量(segmentBaseOffset)。客户端调用getlastOffset()获取的是每个片段文件的基准偏移量。
客户端发送的偏移毡’请求(OffsetRequest)包含的数据是:分区偏移量的请求信息(PartitionOffsetinfo)。这个对象有两个参数:whichTime表示拉取的时间戳,默认第一次拉取的时间戳为EarliestTime=-2,如果拉取响应的错误码是OffsetOutofRange,则时间戳设置为LatestTime=-1;maxNuMOffsets表示需要获取多少个片段文件的基准偏移量,消费者获取最近的偏移量通常只需要一个偏移盘值,所以第二个参数值为1。相关代码如下:
消费者发送的偏移量请求类型是LIST_OFFSETS,服务端使用handleOffsetRequest()处理请求,并返回分区的偏移量集合。存储消息时除了存储消息内容本身,还会存储消息对应的偏移盏,但Li.stOffsets并不是要返回所有消息的偏移量,而是每个片段文件的基准偏移量。一个分区的片段文件数量并不会很多,相比有多少条消息就返回多少个偏移盘,后者的数据盘传输更少且更快。
消费者读取分区的偏移虽有一个限制条件:不能超过服务端中这个分区的最高水位(HighWatermark,下文简称HW)。服务端只能保证HW之前的消息已经提交,而HW之后的消息没有提交。fetchOffsets()返回的是按照偏移量降序排列的数组,如果偏移量比HW大,则会被丢弃。相关代码如下:
fetchOffsetsBefore()方法获取指定时间戳之前的偏移量,最后返回的是片段文件对应的基准偏移量。每个片段文件对应一个基准偏移盘,startindex表示片段文件的索引编号。读取片段文件跟重置策略有关,如果重置策略是最早(EARLIEST_TImESTAmP),IQiJstart!ndex置为O(即第一个片段文件);如果是最近(LATEST_TImESTAmP),则是最后一个片段文件的索引编号。
offsetTimeArray数组会按照时间戳的升序,存储所有片段文件的基准偏移量和最近修改的时间,这个修改时间就是用来和时间戳参数比较的依据:要返回指定时间戳之前的偏移盘,应该从后面的片段文件开始往前推;如果片段文件的最近修改时间比指定的时间戳小,贝iJ设置start!ndex为当前找到的片段文件。
片段文件的偏移盘和时间戳是成正比增加的。为了简单起见,假设时间戳和偏移量是等价的,并假设我们要获取时间戳为12之前的3个偏移盘。首先找到小于时间戳的最大值是l1,startindex就是位置ll,然后再往前找3个,假设allOffsets为[11,8,5],并且hw为10,则hw+:allOffsetsdropWhile(>hw)的结果为List(l0,8,5)。相关代码如下:
注意:dropWhile的含义是将大于hw的删掉。因为allOffsets是降序排列,如果allOffsets中第一个元素就比hw小,就不会丢弃任何元素,比如10+:List(8,5).dropWhile(>10)=List(10,8,5)。如果allOffsets中最小的都比hw要大,最后就只有hw,比如10+:Li.st(20,17,14).dropWhile(_>10)=List(10)。
客户端有了分区,而且也知道要从分区的什么位置开始读取消息,接下来就是向分区的主副本节点发送拉II~:请求以得到消息。
3.6.3 获取分区的读取偏移量相关推荐
- hbase获取region以及读取每个region的第一行
hbase获取region以及读取每个region的第一行 @(HBASE)[hbase] 1.通过HRegionInfo可以获取region的详细信息 2.Scan#setBatch(1)可以指定每 ...
- android 读取文件内容,Android读写文件 获取文件并读取写入数据
一. 从 resource 中的 raw 文件夹中获取文件并读取数据(资源文件只能读不能写) String res = ""; try{ InputStream in ...
- kafka对单分区重设偏移量
一.整个kafka设置偏移量 对kafka整个集群设置偏移量大家使用较多,适合测试环境,丢弃整个消息队列中的数据: ./kafka-consumer-groups.sh --bootstrap-ser ...
- 企业微信开发文档接口API获取accesstoken和读取成员内部员工
企业微信开发文档接口API获取accesstoken和读取成员内部员工 <?php /*** 企业微信 API*/ namespace app\common;use think\Config; ...
- Spark数据分区(partitionBy分区、partitioner获取分区方式、自定义分区)
数据分区 partitionBy分区 在分布式程序中,通信的代价是很大的,因此控制数据分布以获得最少的网络传输可以极大地提升整体性能.和单节点的程序需要为记录集合选择合适的数据结构一样,Spark 程 ...
- java获取音乐_Java读取MP3文件的信息(歌曲名,歌手...)
还记得之前写一款Android播放软件时,为了让APP获得MP3音乐文件的相关信息,上网找了很多Java库.搞的APP满身赘肉.后来我研究了一下MP3文件的结构后发现,获取MP3文件信息根本不需要什么 ...
- Java获取当前路径和读取文件
1.利用System.getProperty()函数获取当前路径: System.out.println( System.getProperty("user.dir") );//u ...
- php获取src,PHP读取文件
本文概述 PHP提供了各种功能来从文件读取数据.有多种功能允许你读取所有文件数据, 逐行读取数据以及逐字符读取数据. 下面提供了可用的PHP文件读取功能. fread() fgets() fgetc( ...
- Spark采用分区方式读取数据库时partitionColumn, lowerBound, upperBound, numPartitions的理解与验证
关键概念 partitionColumn:分区字段,需要是数值类的(partitionColumn must be a numeric column from the table in questio ...
最新文章
- 【Java基础】Java中的char是否可以存储一个中文字符之理解字符字节以及编码集
- windows 7架设OpenSSH服务器实践
- 弱类型语言的优势:C#的委托概念在Javascript中的实现
- python在线投票系统 统计票数_分层分平台,让每个学生享受教育公平 ——冯敬益老师的Python编程教学探索...
- Bootstrap 3: 图标转换事件 Change icons when toggle
- ip层和4层的接口实现分析
- 学习vue3系列watch
- shell 整理(40)====破解加密的qq号
- scala map,foreach,flatMap等方法对比
- 关于数据库timestamp类型问题
- 工业机器人演示码垛和卸垛_「成果播报」流水线上的“专家”——智能拆垛装车机器人系统...
- rm命令-每日Linux命令
- java web后台生成随机数字字母验证码
- 阿里云虚拟空间No input file specified
- 视频正在os x使用中_如何在OS X中使用家长控制来保护孩子
- [架构之路-179]-《软考-系统分析师》-19- 系统可靠性分析与设计 -1- 故障模型、可靠性模型、可靠性分析
- 卧槽:原来7-zip才是解压缩软件中的业界良心!
- pytorch - swa_model模型保存的问题
- 听了老同志的教导:\r \n 到底是什么
- learnLinux