zoukankan      html  css  js  c++  java
  • kafka compaction 分析(基于kafka 0.10.2版本)

    一、基本概念:
    cleanableRatio:清理比率,可清理的字节大小/该log文件总的字节大小,对应代码:
    val cleanableBytes = log.logSegments(firstDirtyOffset, math.max(firstDirtyOffset, firstUncleanableOffset)).map(_.size).sum val totalBytes = cleanBytes + cleanableBytes val cleanableRatio = cleanableBytes / totalBytes.toDouble
     
    deleteRetentionMs: 保留时间,对应配置是log.cleaner.delete.retention.ms
    min.compaction.lag.ms:在改配置时间范围内的segment不做compacttion清理;
    二、具体流程:
    主要分为以下几步:
    1、从清理比率超过最小清理比率的log中选出清理比率最大的partition log,以及其清理范围;
    2、构建一个offsetMap:key是record.key,value是record.offset,遍历读取1中选出log的清理范围内的record,针对一个record而言,如果该record的offset大于map中的,那么覆盖;
    3、遍历清理范围内的record,根据offsetMap记录每个key的最大offset以及过期时间来判断是否要清理对应的record,也就是是否要刷到磁盘文件中,具体逻辑是:
    if(record.offset < offsetMap.get(record.key)){
       该消息放弃不刷到磁盘文件中;
    }else if(record.offset > offsetMap.get(record.key) ){
      if(oldSegment.lastTime < 过期时刻){
          该消息放弃不刷到磁盘文件中;
       }else{
          刷磁盘文件中保留;
      }
    }
    其中过期时刻=清理范围内的segment最大修改时间戳 - deleteRetentionMs
     
    注:针对一个segment的清理,是读取old segment消息,判断是否保留,如果保留那么append到new segment中,最后用new segment 覆盖 old segment;
     
  • 相关阅读:
    在ubuntu 12.04 中配置java环境(安装jdk, tomcat, maven, eclipse)
    java 对EXCEL表格的处理
    JAVA下载文件中文乱码问题
    Java 判断文件夹、文件是否存在、否则创建文件夹
    jspSmartUpload上传下载全攻略
    intellJ实用技巧
    main 方法,
    老师,有没有类似微信布局的好的开源库?
    Android 日常开发总结的技术经验 60 条
    新的android studio创建的fragment工程跟老师讲的结构有区别
  • 原文地址:https://www.cnblogs.com/lordcheng/p/11124981.html
Copyright © 2011-2022 走看看