kafka详细面试题集

kafka详细面试题集


下面这些题是根据别人的博客引用,然后根据自己看视频学的进行了部分答案修正完善来的。仅供参考,欢迎吐槽。

1、Kafka的用途有哪些?使用场景如何?

  1. 日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如Hadoop、Hbase、Solr等
  2. 消息系统:解耦和生产者和消费者、缓存消息等
  3. 用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到Hadoop、数据仓库中做离线分析和挖掘
  4. 运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告
  5. 流式处理:比如spark streaming和storm

2、 Kafka中的ISR、AR又代表什么?ISR的伸缩又指什么

  1. 分区中的所有副本统称为AR(Assigned Repllicas)。所有与leader副本保持一定程度同步的副本(包括Leader)组成ISR(In-Sync Replicas),ISR集合是AR集合中的一个子集。与leader副本同步滞后过多的副本(不包括leader)副本,组成OSR(Out-Sync Relipcas),由此可见:AR=ISR+OSR。
  2. ISR集合副本选举规则在0.9版本前是以副本与Leader同步数据条数不超过阈值为条件,0.9之后改为同步相应时间不超过阈值。
  3. 每个分区的leader副本都会维护此分区的ISR集合,写请求首先由leader副本处理,之后follower副本会从leader副本上拉取写入的消息,这个过程会有一定的延迟,导致follower副本中保存的消息略少于leader副本,只要未超出阈值都是可以容忍的
    4、ISR的伸缩指的是Kafka在启动的时候会开启两个与ISR相关的定时任务,名称分别为“isr-expiration"和”isr-change-propagation".。isr-expiration任务会周期性的检测每个分区是否需要缩减其ISR集合。

3、Kafka中的HW、LEO、LSO、LW等分别代表什么?

  1. HW是High Watermak的缩写,俗称高水位,它表示了一个特定消息的偏移量(offset),消费者只能拉取到这个offset之前的消息。
  2. LEO是Log End Offset的缩写,它表示了当前日志文件中下一条待写入消息的offset。每个副本维护了一个自己的LEO。
  3. LSO特指Last Stable Offset。它具体与kafka的事务有关。消费端参数——isolation.level,这个参数用来配置消费者事务的隔离级别。字符串类型,“read_uncommitted”和“read_committed”。
  4. LW是Low Watermark的缩写,俗称“低水位”,代表AR集合中最小的logStartOffset值,副本的拉取请求(FetchRequest)和删除请求(DeleteRecordRequest)都可能促使LW的增长。
  5. 当Leader挂掉后,ISR中的Follower竞选成为Leader后,通知所有Follower截掉HW之后的数据,然后Leader将HW之后的数据同步到Follower去,保证数据的一致性性。

4、Kafka中是怎么体现消息顺序性的?

原博客的答案是如下:

1、一个 topic,一个 partition,一个 consumer,内部单线程消费,单线程吞吐量太低,一般不会用这个。
2、写 N 个内存 queue,具有相同 key 的数据都到同一个内存 queue;然后对于 N 个线程,每个线程分别消费一个内存 queue 即可,这样就能保证顺序性。

但是从我看到的资料上讲的,上面的方案恐怕并不能保证消息顺序性,再一个partition的前提下,先不考虑consumer那端,ack设置为-1,不然会丢数据,看下面案例:
第一次生产者发送消息:123,出个某种原因ack还没回来(比如kafka临时故障),生产者继续发送消息456,ack返回成功,第一次发送消息的ack超时时间到了,生产者没收到ack,生成会再次方式123给kafka,然后kafka接收成功返回ack,那么这个时候在kafka中消息的顺序则是456123.
所以kafka并不能保证消息顺序的强一致性。如果需要消息顺序的强一致性还是不要选择kafka吧。

5、Kafka中的分区器、序列化器、拦截器是否了解?它们之间的处理顺序是什么?

处理顺序:拦截器 -> 序列化器 -> 分区器
Producer拦截器(interceptor)是在Kafka 0.10版本被引入的,主要用于实现clients端的定制化控制逻辑。producer允许用户指定多个interceptor按序作用于同一条消息从而形成一个拦截链(interceptor chain)。Intercetpor的实现接口是org.apache.kafka.clients.producer.ProducerInterceptor。实现下面四个方法:
1. configure(configs):获取配置信息和初始化数据时调用
2. onSend(ProducerRecord):用户可以在该方法中对消息做任何操作,但最好保证不要修改消息所属的topic和分 区,否则会影响目标分区的计算
3. onAcknowledgement(RecordMetadata, Exception):该方法会在消息被应答或消息发送失败时调用
4. close:关闭interceptor,主要用于执行一些资源清理工作

5、Kafka生产者客户端的整体结构是什么样子的?使用了几个线程来处理?分别是什么?

在这里插入图片描述

7、消费组中的消费者个数如果超过topic的分区,那么就会有消费者消费不到数据”这句话是否正确?如果不正确,那么有没有什么hack的手段?

正确的,topic中的分区只会指给同一消费者组中的一个消费者消费,但是同一个消费者可以消费多个分区。最好的搭配是一个分区对应一个消费者。

8、消费者提交消费位移时提交的是当前消费到的最新消息的offset还是offset+1?

从下面这个例子中可以看出是offset+1
在这里插入图片描述
在这里插入图片描述

9、有哪些情形会造成重复消费?

消费者消费后没有commit offset(程序崩溃/强行kill/消费耗时/自动提交偏移情况下unscrible)

10、那些情景下会造成消息漏消费?

先提交offset,后消费,有可能造成数据的重复 。

11、KafkaConsumer是非线程安全的,那么怎么样实现多线程消费?

参考:https://www.jianshu.com/p/0a05633978f0

  1. 每个线程维护一个KafkaConsumer
  2. 维护一个或多个KafkaConsumer,同时维护多个事件处理线程(worker thread)

12、简述消费者与消费组之间的关系

消费者从属与消费组,消费偏移以消费组为单位。每个消费组可以独立消费主题的所有数据,同一消费组内消费者共同消费主题数据,每个分区只能被同一消费组内一个消费者消费。

13、当你使用kafka-topics.sh创建(删除)了一个topic之后,Kafka背后会执行什么逻辑?

1)会在zookeeper中的/brokers/topics节点下创建一个新的topic节点,如:/brokers/topics/first
2)触发Controller的监听程序
3)kafka Controller 负责topic的创建工作,并更新metadata cache

14、topic的分区数可不可以增加?如果可以怎么增加?如果不可以,那又是为什么?

可以增加

bin/kafka-topics.sh --zookeeper localhost:2181/kafka --alter --topic topic-config --partitions 3

15、topic的分区数可不可以减少?如果可以怎么减少?如果不可以,那又是为什么?

不可以减少,被删除的分区数据难以处理。

16、创建topic时如何选择合适的分区数?

1)创建一个只有1个分区的topic

2)测试这个topic的producer吞吐量和consumer吞吐量。

3)假设他们的值分别是Tp和Tc,单位可以是MB/s。

4)然后假设总的目标吞吐量是Tt,那么分区数=Tt / max(Tp,Tc)

例如:producer吞吐量=5m/s;consumer吞吐量=50m/s,期望吞吐量100m/s;

分区数=100 / 50 =2分区

分区数一般设置为:3-10个

17、Kafka目前有那些内部topic,它们都有什么特征?各自的作用又是什么?

consumer_offsets 以下划线开头,保存消费组的偏移

18、优先副本是什么?它有什么特殊的作用?

优先副本 会是默认的leader副本 发生leader变化时重选举会优先选择优先副本作为leader

19、Kafka有哪几处地方有分区分配的概念?简述大致的过程及原理。

Kafka提供的两种分配策略: range和roundrobin,由参数partition.assignment.strategy指定,默认是range策略。
当以下事件发生时,Kafka 将会进行一次分区分配:

  • 同一个 Consumer Group 内新增消费者
  • 消费者离开当前所属的Consumer Group,包括shuts down 或 crashes
    订阅的主题新增分区

1)Range strategy
Range策略是对每个主题而言的,首先对同一个主题里面的分区按照序号进行排序,并对消费者按照字母顺序进行排序。
2) RoundRobin strategy
使用RoundRobin策略有两个前提条件必须满足:
同一个Consumer Group里面的所有消费者的num.streams必须相等;
每个消费者订阅的主题必须相同。
所以这里假设前面提到的2个消费者的num.streams = 2。
RoundRobin策略的工作原理:将所有主题的分区组成 TopicAndPartition 列表,然后对 TopicAndPartition 列表按照 hashCode 进行排序

20、简述Kafka的日志目录结构。Kafka中有那些索引文件?

每个分区对应一个文件夹,文件夹的命名为topic-0,topic-1,内部为.log和.index文件

21、如果我指定了一个offset,Kafka Controller怎么查找到对应的消息?

在这里插入图片描述
每个.index文件的名字会以该索引文件开始的偏移量命名,索引文件由一个个的Segement组成,每个Segement大小一样,这样就可以快速定位到查找偏移量对应的Segement,然后从segement中得到对应.log文件中消息的开始位置。从而得到offset对应的消息。

22、聊一聊Kafka Controller的作用?

负责管理集群broker的上下线,所有topic的分区副本分配和leader选举等工作。

23、Kafka中有那些地方需要选举?这些地方的选举策略又有哪些?

partition leader(ISR),controller(先到先得)

24、失效副本是指什么?有那些应对措施?

不能及时与leader同步,暂时踢出ISR,等其追上leader之后再重新加入

25、Kafka的那些设计让它有如此高的性能?

分区,顺序写磁盘,0-copy

26、kafka过期数据清理

日志清理保存的策略只有delete和compact两种

log.cleanup.policy=delete启用删除策略

log.cleanup.policy=compact启用压缩策略

27、Kafka中的幂等是怎么实现的

启用幂等性,配置enable.idempotence为true即可,开启幂等性后,Producer在初始化时会分配一个PID,发往同一Partition的消息会附带SequenceNumber,Broker端会对<PID,Partition,SeqNumber>做缓存,从而保证消息的唯一性。
但是PID再producer重启后重新分配,同事不同的Partition也有不同的主键,所以幂等性不能保证跨多个Topic-Partition。

28、kafka事务。

参考:http://matt33.com/2018/11/04/kafka-transaction/
幂等性实现是事务性实现的基础,幂等性提供了单会话单 Partition Exactly-Once 语义的实现,正是因为 Idempotent Producer 不提供跨多个 Partition 和跨会话场景下的保证,因此,我们是需要一种更强的事务保证,能够原子处理多个 Partition 的写入操作,数据要么全部写入成功,要么全部失败,不期望出现中间状态。
Kafka 事务性的使用方法也非常简单,用户只需要在 Producer 的配置中配置 transactional.id,通过 initTransactions() 初始化事务状态信息,再通过 beginTransaction() 标识一个事务的开始,然后通过 commitTransaction() 或 abortTransaction() 对事务进行 commit 或 abort

27、Kafka中的延迟队列怎么实现?

参考:https://blog.csdn.net/u013256816/article/details/80697456
Kafka中存在大量的延迟操作,比如延迟生产、延迟拉取以及延迟删除等。Kafka并没有使用JDK自带的Timer或者DelayQueue来实现延迟的功能,而是基于时间轮自定义了一个用于实现延迟功能的定时器(SystemTimer)。JDK的Timer和DelayQueue插入和删除操作的平均时间复杂度为O(nlog(n)),并不能满足Kafka的高性能要求,而基于时间轮可以将插入和删除操作的时间复杂度都降为O(1)。Kafka中的时间轮(TimingWheel)是一个存储定时任务的环形队列,底层采用数组实现,数组中的每个元素可以存放一个定时任务列表(TimerTaskList)。TimerTaskList是一个环形的双向链表,链表中的每一项表示的都是定时任务项(TimerTaskEntry),其中封装了真正的定时任务TimerTask。时间轮由多个时间格组成,每个时间格代表当前时间轮的基本时间跨度(tickMs)。时间轮的时间格个数是固定的,可用wheelSize来表示,那么整个时间轮的总体时间跨度(interval)可以通过公式 tickMs × wheelSize计算得出。

另附kafka监控平台

kafka管理界面 kafka-eagle:https://www.jianshu.com/p/db9f37bb7f98

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值