kafka面试题(16-26)(续)

16、kafka是如何做到高效读写

1)Kafka 本身是分布式集群,可以采用分区技术,并行度高

2)读数据采用稀疏索引每往log文件写入4kb数据,才会往index文件写入一条offset,写入的还是相对索引),可以快速定位要消费的数据

3)顺序写磁盘

生产者的数据写入到 log 文件中时,是一直追加到文件末端, 为顺序写。同样的磁盘,顺序写能到 600M/s,而随机写只有 100K/s。省去了大量磁头寻址的时间。

4)页缓存 + 零拷贝技术

    零拷贝:生产者的数据不会在kafka集群中保留,而是写入磁盘,消费者读取时,直接从磁盘读取,减少了和kafka集群的交互。

   页缓存:当生产者产生数据时,操作系统只是将数据写入 PageCache。当消费者读取时,先从PageCache中查找,如果找不到,再去磁盘中读取(PageCache是把尽可能多的空闲内存都当做了磁盘缓存来使用)。


17、Kafka集群中数据的存储是按照什么方式存储的?

image.png

    每个主题的partition分可以为多个segment。每个segment包括:“.index”文件、“.log”文件和.timeindex等文件。

每个partition的数据对应于一个log文件,Producer生产的数据存储在log文件中。新产生的数据会被不断追加到该log文件末端。(每往log文件写入4kb数据,会往index文件写入一条offset

“.index”文件中存放的时写入文件的相对偏移量和位置


18、kafka中是如何快速定位到一个offset的。

先确定查找的offset所在的segment,找到小于目标offset的最大offset对应的索引

index文件名的数字加上相对offset( 522  +  65  = 587),进而定位到log文件中

目标数据所在的record ,遍历record查询所找的数据


19、简述kafka中的数据清理策略。

Kafka 中默认的数据保存时间为 7 天,7天后删除。可以更改配置文件修改

          Kafka 中提供的日志清理策略有 delete 和 compact 两种。

1)delete 日志删除:将过期数据删除

           log.cleanup.policy = delete 所有数据启用删除策略

           基于时间:默认打开。以 segment 中所有记录中的最大时间戳作为该文件时间戳。

           基于大小:默认关闭。超过设置的所有日志总大小(1G),删除最早的 segment。

 2)compact日志压缩:对于相同key的不同value值,只保留最后一个版本,类似hbase的storefile的compact合并。


20、消费者组和分区数之间的关系是怎样的?

image.png

   消费者组中的消费者数量要小于等于分区数,两个消费者不能消费同一个分区,同一个消费者可以消费不同的分区。

      如果消费者数量大于分区数,多余的消费者就会处于空闲,浪费资源。


21、kafka如何直到哪个消费者消费哪个分区? 

           每个kafka节点会有一个coordinator,当消费者要消费数据时,由消费者组的groupid的hash值对分区数取模,结果是几,哪个的节点就负责消费者组的分区分配方案的分发

      确定coordinator后,每个消费者都会发送心跳,coordinator制定一个消费者成为leader,把topic的分区情况发给leader,由leader指定指定消费方案并发给coordinator,coordinator会把消费方案分发给各个消费者。

   每个消费者都会和coordinator保持心跳(默认3s)超过45s没有心跳或处理时长超过5 分钟,会触发再分配。


22、kafka消费者的消费分区策略有哪些,默认是个?

分区分配策略: Range、RoundRobin(轮训)、Sticky(粘性)、CooperativeSticky

      默认: Range +CooperativeSticky;


23、kafka中的消费者,他们的偏移量存储在哪里?

        0.9版本前,消费者的偏移量存储在zk中

       0.9版本后,消费者的偏移量存储在系统生成的topic中  __consumer_offsets


24、kafka中数据挤压太多,怎么办?(提高消费者的效率)

   1、如果是消费者的消费能力不够,可以增加分区数和消费者数,

          提高并行度有助于提高消费者效率

   2、如果是消费能力小于生产数据的能力,可以增加每次拉去数据的最大条数(默认500条),

      提高每次拉取文件的最大容量(认50m)。


25、Kafka中的数据在消费过程中,有漏消费和重复消费的情况,怎么办?

image.png

     重复消费:自动提交offset时会出现,kafka是每5s提交一次offset,如果消费了一条数据后还没提交就挂了,在重启后会从上次的offset出重新消费,就会有重复消费的情况。

    漏消费:手动提交offset时会出现,当消费者提交offset,数据还在内存中还未落盘时,消费者挂了,那么重启后就会从下一个offset处消费,就会出现漏消费。

避免重复消费和漏消费的情况:使用消费者事务,将offset保存在支持事务的介质中,比如mysql。


26、kafka中的数据已经消费过的数据,是否可以再次消费?怎么做?

可以

1、kafka可以指定消费数据的offset,指定以消费过的数据的offset就可以再次读取以消费的数据。

2、kafka也可以消费指定时间前的偏移量的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值