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 获取分区的读取偏移量相关推荐

  1. hbase获取region以及读取每个region的第一行

    hbase获取region以及读取每个region的第一行 @(HBASE)[hbase] 1.通过HRegionInfo可以获取region的详细信息 2.Scan#setBatch(1)可以指定每 ...

  2. android 读取文件内容,Android读写文件 获取文件并读取写入数据

    一.       从 resource 中的 raw 文件夹中获取文件并读取数据(资源文件只能读不能写) String res = ""; try{ InputStream in ...

  3. kafka对单分区重设偏移量

    一.整个kafka设置偏移量 对kafka整个集群设置偏移量大家使用较多,适合测试环境,丢弃整个消息队列中的数据: ./kafka-consumer-groups.sh --bootstrap-ser ...

  4. 企业微信开发文档接口API获取accesstoken和读取成员内部员工

    企业微信开发文档接口API获取accesstoken和读取成员内部员工 <?php /*** 企业微信 API*/ namespace app\common;use think\Config; ...

  5. Spark数据分区(partitionBy分区、partitioner获取分区方式、自定义分区)

    数据分区 partitionBy分区 在分布式程序中,通信的代价是很大的,因此控制数据分布以获得最少的网络传输可以极大地提升整体性能.和单节点的程序需要为记录集合选择合适的数据结构一样,Spark 程 ...

  6. java获取音乐_Java读取MP3文件的信息(歌曲名,歌手...)

    还记得之前写一款Android播放软件时,为了让APP获得MP3音乐文件的相关信息,上网找了很多Java库.搞的APP满身赘肉.后来我研究了一下MP3文件的结构后发现,获取MP3文件信息根本不需要什么 ...

  7. Java获取当前路径和读取文件

    1.利用System.getProperty()函数获取当前路径: System.out.println( System.getProperty("user.dir") );//u ...

  8. php获取src,PHP读取文件

    本文概述 PHP提供了各种功能来从文件读取数据.有多种功能允许你读取所有文件数据, 逐行读取数据以及逐字符读取数据. 下面提供了可用的PHP文件读取功能. fread() fgets() fgetc( ...

  9. Spark采用分区方式读取数据库时partitionColumn, lowerBound, upperBound, numPartitions的理解与验证

    关键概念 partitionColumn:分区字段,需要是数值类的(partitionColumn must be a numeric column from the table in questio ...

最新文章

  1. 【Java基础】Java中的char是否可以存储一个中文字符之理解字符字节以及编码集
  2. windows 7架设OpenSSH服务器实践
  3. 弱类型语言的优势:C#的委托概念在Javascript中的实现
  4. python在线投票系统 统计票数_分层分平台,让每个学生享受教育公平 ——冯敬益老师的Python编程教学探索...
  5. Bootstrap 3: 图标转换事件 Change icons when toggle
  6. ip层和4层的接口实现分析
  7. 学习vue3系列watch
  8. shell 整理(40)====破解加密的qq号
  9. scala map,foreach,flatMap等方法对比
  10. 关于数据库timestamp类型问题
  11. 工业机器人演示码垛和卸垛_「成果播报」流水线上的“专家”——智能拆垛装车机器人系统...
  12. rm命令-每日Linux命令
  13. java web后台生成随机数字字母验证码
  14. 阿里云虚拟空间No input file specified
  15. 视频正在os x使用中_如何在OS X中使用家长控制来保护孩子
  16. [架构之路-179]-《软考-系统分析师》-19- 系统可靠性分析与设计 -1- 故障模型、可靠性模型、可靠性分析
  17. 卧槽:原来7-zip才是解压缩软件中的业界良心!
  18. pytorch - swa_model模型保存的问题
  19. 听了老同志的教导:\r \n 到底是什么
  20. learnLinux

热门文章

  1. 什么是React为什么使用React什么时候使用React
  2. XDOJ综合题 数字统计排序
  3. Appium JAVA ios 设备 AUT not install
  4. StartActivity的2种用法
  5. 佛祖保佑 永无shell
  6. Office Excel2010保存新文件时出现未响应或者卡死的解决办法
  7. 微信小程序入门与实战之阅读列表与setData数据的绑定
  8. 流行和声(5)minor7和弦
  9. 给你一个小时,怎样有序撬启Web测试?
  10. 关于瞬时功率的无功功率和有功功率,在不同坐标系下的验证