16、kafka是如何做到高效读写
1)Kafka 本身是分布式集群,可以采用分区技术,并行度高
2)读数据采用稀疏索引(每往log文件写入4kb数据,才会往index文件写入一条offset,写入的还是相对索引),可以快速定位要消费的数据
3)顺序写磁盘
生产者的数据写入到 log 文件中时,是一直追加到文件末端, 为顺序写。同样的磁盘,顺序写能到 600M/s,而随机写只有 100K/s。省去了大量磁头寻址的时间。
4)页缓存 + 零拷贝技术
零拷贝:生产者的数据不会在kafka集群中保留,而是写入磁盘,消费者读取时,直接从磁盘读取,减少了和kafka集群的交互。
页缓存:当生产者产生数据时,操作系统只是将数据写入 PageCache。当消费者读取时,先从PageCache中查找,如果找不到,再去磁盘中读取(PageCache是把尽可能多的空闲内存都当做了磁盘缓存来使用)。
17、Kafka集群中数据的存储是按照什么方式存储的?
每个主题的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、消费者组和分区数之间的关系是怎样的?
消费者组中的消费者数量要小于等于分区数,两个消费者不能消费同一个分区,同一个消费者可以消费不同的分区。
如果消费者数量大于分区数,多余的消费者就会处于空闲,浪费资源。
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中的数据在消费过程中,有漏消费和重复消费的情况,怎么办?
重复消费:自动提交offset时会出现,kafka是每5s提交一次offset,如果消费了一条数据后还没提交就挂了,在重启后会从上次的offset出重新消费,就会有重复消费的情况。
漏消费:手动提交offset时会出现,当消费者提交offset,数据还在内存中还未落盘时,消费者挂了,那么重启后就会从下一个offset处消费,就会出现漏消费。
避免重复消费和漏消费的情况:使用消费者事务,将offset保存在支持事务的介质中,比如mysql。
26、kafka中的数据已经消费过的数据,是否可以再次消费?怎么做?
可以
1、kafka可以指定消费数据的offset,指定以消费过的数据的offset就可以再次读取以消费的数据。
2、kafka也可以消费指定时间前的偏移量的数据。