kafka面试题-边学边总结

1、kafka是什么?可以用来做什么?

kafka: 消息中间件(MQ类似功能)、消息引擎、分布式实时流处理平台,与RabbitMQ的一个区别是 消费后 不会被删除
可以用来:
大数据领域(网站行为分析、日志聚合、应用监控、流式数据处理、在线和离线数据分析);
数据集成(将消息导入MaxCompute、OOS、RDS、Hadoop、HBase等离线数据仓库);
流计算集成(与StreamCompute、E-MapReduce、Spark、Storm等流计算引擎集成)

2、为什么kafka安装需要依赖Zookeeper?

集群管理、节点的管理、admin管理工具、配置管理(有哪些broker、Topic、分区、消费者等)、节点的选举都是利用zookeeper实现的

3、pull和push,kafka支持哪种消费模型?为什么这么设计?

支持pull,由自己决定什么时候获取消息和获取多少消息
因为kafka的应用场景是消息数据量非常大的情况,采用push的话,如果生产者的生产消息的速度远远大于消费消息的速度,会给消费者带来非常大的负担,可能会给消费者搞挂掉

4、Topic的用途是什么?为什么Kafka没有队列?

生产者和消费者是通过Topic关联起来的,实际上可以理解为是一种业务类型的消息的集合

5、分区Patition的作用是什么?

因为一个Topic钟消息数可能会很大,利用分区解决扩展和并发访问的问题,实现负载的功能

6、分区数和副本数怎么设置?

一个Topic的分区数并不是越多越好的

7、分区的副本在Broker上是怎么分布的?假设有3个Broker,一个Topic有两个分区,每个分区两个副本,可能的分布情况是什么样的?

一个分区的多个副本,是分布在不同的Broker上的,一个分区有两个副本的话,其中一个Broker是没有副本的,原则上就是一个分区的不同的副本必须在不同的机器

8、Segment的作用是什么?=》分段

Segment是对Partition的进一步细化,通过log.segment.bytes(单个日志段文件最大大小)指定的大小来决定一个Log文件的最大值,当达到最大值后,会出现一套新的 .index.log.timeindex文件,会降低Partition的读写压力

9、Consumer Group的含义是什么?

消费者组,是为了让消费者们消费不同的partition,如果消费者组中的groupId是相同的,他们是不允许消费同一个Topic中的相同partition的,一个消费者可以消费多个分区partition

10、Consumer Group上消费的偏移量记录在哪里?怎么更新?

记录在一个特殊的Topic里面,_consumer_offsets-21中,其中_consumer_offsets的存储结构是有两部分:
GroupMetadata:保存了消费者组中各个消费者的信息(每个消费者有编号)
OffsetAndMetadata:保存了消费者组和各个partition的offset位移信息元数据

如何更新:通过提交更新
1、enable.auto.commit=true:自动提交
2、enable.auto.commit=false:业务处理完后手动提交;consumer.commitSync()-同步提交、consumer.commitAsync()-异步提交

11、生产者送消息如何选择分区?

(1)指定分区
(2)没有指定分区,自定义了分区器,则按照自定义的规则来 (实现Partitioner接口定义分区器)
(3)没有指定分区,没有自定义分区器,但是key不为空,则hash以后取余(Utils.toPositive(Utils.murmur2(key))%numPartitions) numPartitions是分区数量
(4)没有指定分区,没有自定义分区器,但是key是空的,则整数自增取模=》先随机生成一个整数random, 然后random%numPartitions 为此次分区号,下一次是 (random+1)%numPartitions

12、生产者acks 1 0-1的含义是什么?

acks 为0:指不等待ACK,说明消息不重要,生产者只管把消息发出即可,不用得到“是否收到”的回复
acks 为1: 默认情况,只需要leader收到消息,写入到磁盘,就会给生产者返回一个ack,有风险因为如果leader挂掉了,而副本还没来得及写入消息的话,那就会造成消息丢失
acks 为-1或者all,指leader和全部follower都落盘成功才返回ack,也会有风险,因为可能返回ack时失败,生产者可能会重发尝试(可能会有消息重复的问题,所以可以把retry 设为0 则不会尝试重发)

13、消息主要的物理存储文件有哪些?

14、Kafka中有哪些索引类型?消息怎么通过索引检索?

索引类型:稀疏索引,时间戳索引
检索过程:
(1)根据offset判断在哪个segment中
(2)在segment的indexfile中,根据offset找到消息的position
(3)根据position从log文件中比较,最终找到消息

15、kafka的稀疏索引,间隔由什么决定?为什么不用B+Tree?

间隔:由消息的大小决定的,log.index.interval.bytes(默认4096,索引字段大小间隔,间隔越大代表扫描速度越快,但也更耗内存)设置大小间隔字节数,时间复杂度为O(log2n)+O(m)
n:索引文件个数 m稀疏程度
为什么不用B+Tree?
和应用场景有关,kafka的写消息绝对多于读消息

16、kafka的日志文件不可能无限扩大,那么可以通过哪些方式释放磁盘空间?

消息清理策略
1》开关:log.cleaner.enable=true 启用一个定时任务
2》策略:log.cleanup.policy=delete(默认)/compact 对日志文件是删除还是压缩
delete:删除
compact:压缩,可以理解为同一个key的消息,只保留最新的,把旧数据删掉
3》周期:log.retention.check.interval.ms=300000 定时任务的清理周期
4》过期定义:存在多长时间的文件属于过期文件-日志删除的时间阙值
log.retention.hours/log.retention.minutes/log.retention.ms
5》文件限制:因为存在时间长不一定有数据,而且有些文件超时后也不一定要清理掉,可以设置日志删除的大小阙值
log.retention.bytes/log.segment.bytes

17、kafka副本Leader是怎么选举的?谁来选举?选谁为Leader?什么是AR?什么是ISR?什么是OSR?

1》什么时候触发选举?:Leader挂掉后,新leader要从ISR中选举出来;或者添加了一个新的分区,这个分区有多个副本,还没leader的时候
2》谁可以参加选举?:从ISR中选举;如果ISR为空的,则从OSR中选举(不干净的选举,因为可能丢数据,这种方式默认是关闭的 unclean.leader.election.enable=false 指可以不在ISR中选举出Leader)
3》怎么选举?:利用PacificA算法将ISR中的第一个副本作为Leader
4》谁来主持选举?:选择一个节点(Broker)来作为Controller,来主持选举的事,类似Redis中哨兵;这个主持人是 通过zookeeper方式选举出来的,通过在Zookeeper中创建controller节点,创建成功的Broker为主持人
5》为什么不用Zookeeper来进行副本leader的选举呢?因为分区多,分区的副本也多,这种情况下,竞选leader的情况就会几何数字增长,如果所有Topic下所有分区的所有副本都尝试建立有序节点、临时节点,zookeeper会不堪重负,所以没采用Zookeeper;
6》AR:全部副本
7》ISR:与主节点保持同步的副本 in-sync replica set;
副本什么时候移除出ISR?:replica.lag.time.max.ms 设置一个时间,超过这个时间没和主节点保持同步则移出ISR;
8》OSR:没有同步的副本 AR=ISR+OSR

18、kafka副本follower怎么向Leader同步?什么是HW?什么是LEO?

同步过程:
1、Follower节点会向Leader发送一个fetch请求,leader向follower发送数据后,需要更新follower的LEO
2、follower接收导数据响应后,依次写入消息并且更新LEO
3、Leader更新HW(ISR最小的LEO)

LEO:Log End Offset 每一个副本中下一条等待写入的消息的offset(最新的offset+1)
HW:Hign Watermark :ISR中最小的LEO,指定最近可以消费的消息,HW及之后的消息不可消费

19、kafka的offset怎么维护?存在哪里?什么时候更新?

20、一个消费组中的消费者与分区的关系是什么样的?例如topic有5个分区,假如有2个消费者,怎么分配?假如有6个消费者,怎么分配?

关系:重复消费
默认的分配策略:范围分配 RangeAssignor
5个分区,2个消费者:A消费者 分区1、分区2、分区3 ;B消费者 分区4、分区5
5个分区,6个消费者:A消费者 分区1;B消费者分区2;C消费者分区3;D消费者分区4;E消费者分区5; F消费者没有;

轮训分配 RoundRobinAssignor 轮着来
5个分区,2个消费者:A消费者 分区1、分区3、分区5 ;B消费者 分区2、分区4
5个分区,6个消费者:A消费者 分区1;B消费者分区2;C消费者分区3;D消费者分区4;E消费者分区5; F消费者没有;

粘滞分配 StickyAssignor 可能每次都不同,尽量均匀分布

也可以给每个消费者指定分区:

TopicPartition tp=new TopicPartition("topic1",1);//指定分区1
consumer.assign(Arrays.asList(tp))

21、kafka为什么这么快?

顺序读写(磁盘文件)、索引、批量读写和文件压缩、零拷贝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值