Kafka相关⾯试题知识点总结
1、请说明什么是Apache Kafka?
Apache Kafka是由Apache开发的⼀种发布订阅消息系统,它是⼀个分布式的、分区的和可复制的提交⽇志服务。
2、说说Kafka的使⽤场景?
①异步处理
②应⽤解耦
③流量削峰
④⽇志处理
⑤消息通讯等。
3、使⽤Kafka有什么优点和缺点?
优点:
①⽀持跨数据中⼼的消息复制;
②单机吞吐量:⼗万级,最⼤的优点,就是吞吐量⾼;
③topic数量都吞吐量的影响:topic从⼏⼗个到⼏百个的时候,吞吐量会⼤幅度下降。所以在同等机器下,kafka尽量保证topic数量不要过多。如果要⽀撑⼤规模topic,需要增加更多的机器资源;
④时效性:ms级;
⑤可⽤性:⾮常⾼,kafka是分布式的,⼀个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可⽤;
⑥消息可靠性:经过参数优化配置,消息可以做到0丢失;
⑦功能⽀持:功能较为简单,主要⽀持简单的MQ功能,在⼤数据领域的实时计算以及⽇志采集被⼤规模使⽤。
缺点:
①由于是批量发送,数据并⾮真正的实时;仅⽀持统⼀分区内消息有序,⽆法实现全局消息有序;
②有可能消息重复消费;
③依赖zookeeper进⾏元数据管理,等等。
4、为什么说Kafka性能很好,体现在哪⾥?
①顺序读写
②零拷贝
③分区
④批量发送
⑤数据压缩
5、请说明什么是传统的消息传递⽅法?
传统的消息传递⽅法包括两种:
排队:在队列中,⼀组⽤户可以从服务器中读取消息,每条消息都发送给其中⼀个⼈。
发布-订阅:在这个模型中,消息被⼴播给所有的⽤户。
6、请说明Kafka相对传统技术有什么优势?
①快速:单⼀的Kafka代理可以处理成千上万的客户端,每秒处理数兆字节的读写操作。
②可伸缩:在⼀组机器上对数据进⾏分区
③和简化,以⽀持更⼤的数据
④持久:消息是持久性的,并在集群中进
⑤⾏复制,以防⽌数据丢失。
⑥设计:它提供了容错保证和持久性
7、解释Kafka的Zookeeper是什么?我们可以在没有Zookeeper的情况下使⽤Kafka吗?
Zookeeper是⼀个开放源码的、⾼性能的协调服务,它⽤于Kafka的分布式应⽤。
不,不可能越过Zookeeper,直接联系Kafka broker。⼀旦Zookeeper停⽌⼯作,它就不能服务客户端请求。
Zookeeper主要⽤于在集群中不同节点之间进⾏通信
在Kafka中,它被⽤于提交偏移量,因此如果节点在任何情况下都失败了,它都可以从之前提交的偏移量中获取
除此之外,它还执⾏其他活动,如: leader检测、分布式同步、配置管理、识别新节点何时离开或连接、集群、节点实时状态等等。
8、解释Kafka的⽤户如何消费信息?
在Kafka中传递消息是通过使⽤ndfile API完成的。它⽀持将字节从套接⼝转移到磁盘,通过内核空间保存副本,并在内核⽤户之间调⽤内核。
9、解释如何提⾼远程⽤户的吞吐量?
如果⽤户位于与broker不同的数据中⼼,则可能需要调优套接⼝缓冲区⼤⼩,以对长⽹络延迟进⾏摊销。
10、解释⼀下,在数据制作过程中,你如何能从Kafka得到准确的信息?
在数据中,为了精确地获得Kafka的消息,你必须遵循两件事: 在数据消耗期间避免重复,在数据⽣产过程中避免重复。
这⾥有两种⽅法,可以在数据⽣成时准确地获得⼀个语义:
每个分区使⽤⼀个单独的写⼊器,每当你发现⼀个⽹络错误,检查该分区中的最后⼀条消息,以查看您的最后⼀次写⼊是否成功
在消息中包含⼀个主键(UUID或其他),并在⽤户中进⾏反复制
11、解释如何减少ISR中的扰动?broker什么时候离开ISR?
ISR是⼀组与leaders完全同步的消息副本,也就是说ISR中包含了所有提交的消息。ISR应该总是包含所有的副本,直到出现真正的故障。如果⼀个副本从leader中脱离出来,将会从ISR中删除。
12、Kafka为什么需要复制?
Kafka的信息复制确保了任何已发布的消息不会丢失,并且可以在机器错误、程序错误或更常见些的软件升级中使⽤。
13、如果副本在ISR中停留了很长时间表明什么?
如果⼀个副本在ISR中保留了很长⼀段时间,那么它就表明,跟踪器⽆法像在leader收集数据那样快速地获取数据。
14、请说明如果⾸选的副本不在ISR中会发⽣什么?
如果⾸选的副本不在ISR中,控制器将⽆法将leadership转移到⾸选的副本。
15、有可能在⽣产后发⽣消息偏移吗?
在⼤多数队列系统中,作为⽣产者的类⽆法做到这⼀点,它的作⽤是触发并忘记消息。broker将完成剩下的⼯作,⽐如使⽤id进⾏适当的元数据处理、偏移量等。
作为消息的⽤户,你可以从Kafka broker中获得补偿。如果你注视SimpleConsumer类,你会注意到它会获取包括偏移量作为列表的MultiFetchRespon对象。此外,当你对Kafka消息进⾏迭代时,你会拥有包括偏移量和消息发送的MessageAndOfft对象。
16、Kafka的设计时什么样的呢?
Kafka将消息以topic为单位进⾏归纳将向Kafka topic发布消息的程序成为producers. 将预订topics并消费消息的程序成为consumer. Kafka以集群的⽅式运⾏,可以由⼀个或多个服务组成,每个服务叫做⼀个broker. producers通过⽹络将消息发送到Kafka集群,集群向消费者提供消息
17、数据传输的事物定义有哪三种?
(1)最多⼀次:
消息不会被重复发送,最多被传输⼀次,但也有可能⼀次不传输
(2)最少⼀次: 消息不会被漏发送,最少被传输⼀次,但也有可能被重复传输.
(3)精确的⼀次(Exactly once): 不会漏传输也不会重复传输,每个消息都传输被⼀次⽽且仅仅被传输⼀次,这是⼤家所期望的
18、Kafka判断⼀个节点是否还活着有那两个条件?
(1)节点必须可以维护和ZooKeeper的连接,Zookeeper通过⼼跳机制检查每个节点的连接
(2)如果节点是个follower,他必须能及时的同步leader的写操作,延时不能太久
19、producer是否直接将数据发送到broker的leader(主节点)?
producer直接将数据发送到broker的leader(主节点),不需要在多个节点进⾏分发,为了帮助producer做到这点,所有的Kafka节点都可以及时的告知:哪些节点是活动的,⽬标topic⽬标分区的leader在哪。
这样producer就可以直接将消息发送到⽬的地了。
20、Kafa consumer是否可以消费指定分区消息?
Kafa consumer消费消息时,向broker发出"fetch"请求去消费特定分区的消息,consumer指定消息在⽇志中的偏移量(offt),就可以消费从这个位置开始的消息,customer拥有了offt的控制权,可以向后回滚去重新消费之前的消息,这是很有意义的
21、Kafka消息是采⽤Pull模式,还是Push模式?
Kafka最初考虑的问题是,customer应该从brokes拉取消息还是brokers将消息推送到consumer,也就是pull还push。在这⽅⾯,Kafka遵循了⼀种⼤部分消息系统共同的传统的设计:producer将消息推送到broker,consumer从broker拉取消息⼀些消息系统⽐如Scribe和Apache Flume采⽤了push模式,将消息推送到下游的consumer。这样做有好处也有坏处:由broker决定消息推送的速率,对于不同消费速率的consumer就不太好处理了。消息系统都致⼒于让consumer以最⼤的速率最快速的消费消息,但不幸的是,push模式下,当broker推送的速率远⼤于consumer消费的速率时,consumer恐怕就要崩溃了。最终Kafka还是选取了传统的pull模式
Pull模式的另外⼀个好处是consumer可以⾃主决定是否批量的从broker拉取数据。Push模式必须在不
知道下游consumer消费能⼒和消费策略的情况下决定是⽴即推送每条消息还是缓存之后批量推送。如果为了避免consumer崩溃⽽采⽤较低的推送速率,将可能导致⼀次只推送较少的消息⽽造成浪费。Pull模式下,consumer就可以根据⾃⼰的消费能⼒去决定这些策略
Pull有个缺点是,如果broker没有可供消费的消息,将导致consumer不断在循环中轮询,直到新消息到t达。为了避免这点,Kafka有个参数可以让consumer阻塞知道新消息到达(当然也可以阻塞知道消息的数量达到某个特定的量这样就可以批量发
22、Kafka存储在硬盘上的消息格式是什么?
消息由⼀个固定长度的头部和可变长度的字节数组组成。头部包含了⼀个版本号和CRC32校验码。
消息长度: 4 bytes (value: 1+4+n)
版本号: 1 byte
CRC校验码: 4 bytes
具体的消息: n bytes
23、Kafka⾼效⽂件存储设计特点:
(1).Kafka把topic中⼀个parition⼤⽂件分成多个⼩⽂件段,通过多个⼩⽂件段,就容易定期清除或删除已经消费完⽂件,减少磁盘占⽤。
(2).通过索引信息可以快速定位message和确定respon的最⼤⼤⼩。
(3).通过index元数据全部映射到memory,可以避免gment file的IO磁盘操作。
(4).通过索引⽂件稀疏存储,可以⼤幅降低index⽂件元数据占⽤空间⼤⼩。
24、Kafka 与传统消息系统之间有三个关键区别
(1).Kafka 持久化⽇志,这些⽇志可以被重复读取和⽆限期保留
(2).Kafka 是⼀个分布式系统:它以集群的⽅式运⾏,可以灵活伸缩,在内部通过复制数据提升容错能⼒和⾼可⽤性
(3).Kafka ⽀持实时的流式处理
25、Kafka创建Topic时如何将分区放置到不同的Broker中
副本因⼦不能⼤于 Broker 的个数;
第⼀个分区(编号为0)的第⼀个副本放置位置是随机从 brokerList 选择的;
其他分区的第⼀个副本放置位置相对于第0个分区依次往后移。也就是如果我们有5个 Broker,5个分区,假设第⼀个分区放在第四个Broker 上,那么第⼆个分区将会放在第五个 Broker 上;第三个分区将会放在第⼀个 Broker 上;第四个分区将会放在第⼆个 Broker 上,依次类推;
剩余的副本相对于第⼀个副本放置位置其实是由 nextReplicaShift 决定的,⽽这个数也是随机产⽣的
26、Kafka新建的分区会在哪个⽬录下创建
在启动 Kafka 集群之前,我们需要配置好 log.dirs 参数,其值是 Kafka 数据的存放⽬录,这个参数可以配置多个⽬录,⽬录之间使⽤逗号分隔,通常这些⽬录是分布在不同的磁盘上⽤于提⾼读写性能。当然我们也可以配置 log.dir 参数,含义⼀样。只需要设置其中⼀个即可。如果 log.dirs 参数只配置了⼀个⽬录,那么分配到各个 Broker 上的分区肯定只能在这个⽬录下创建⽂件夹⽤于存放数据。但是如果 log.dirs 参数配置了多个⽬录,那么 Kafka 会在哪个⽂件夹中创建分区⽬录呢?答案是:Kafka 会在含有分区⽬录最少的⽂件夹中创建新的分区⽬录,分区⽬录名为 Topic名+分区ID。注意,是分区⽂件夹总数最少的⽬录,⽽不是磁盘使⽤量最少的⽬录!也就是说,如果你给 log.dirs 参数新增了⼀个新的磁盘,新的分区⽬录肯定是先在这个新的磁盘上创建直到这个新的磁盘⽬录拥有的分区⽬录不是最少为⽌。
27、partition的数据如何保存到硬盘
topic中的多个partition以⽂件夹的形式保存到broker,每个分区序号从0递增,且消息有序 Partition⽂件下有多个
gment(xxx.index,xxx.log) gment ⽂件⾥的⼤⼩和配置⽂件⼤⼩⼀致可以根据要求修改默认为1g 如果⼤⼩⼤于1g时,会滚动⼀个新的gment并且以上⼀个gment最后⼀条消息的偏移量命名
28、kafka的ack机制
0:⽣产者不会等待broker的ack,这个延迟最低但是存储的保证最弱当rver挂掉的时候就会丢数据
1:服务端会等待ack值 leader副本确认接收到消息后发送ack但是如果leader挂掉后他不确保是否复制完成新leader也会导致数据丢失
-1:同样在1的基础上服务端会等所有的follower的副本受到数据后才会受到leader发出的ack,这样数据不会丢失
29、Kafka的消费者如何消费数据
消费者每次消费数据的时候,消费者都会记录消费的物理偏移量(offt)的位置等到下次消费时,他会接着上次位置继续消费。同时也可以按照指定的offt进⾏重新消费。
30、消费者负载均衡策略
结合consumer的加⼊和退出进⾏再平衡策略。
31、kafka消息数据是否有序?
消费者组⾥某具体分区是有序的,所以要保证有序只能建⼀个分区,但是实际这样会存在性能问题,具体业务具体分析后确认。
32、kafaka⽣产数据时数据的分组策略,⽣产者决定数据产⽣到集群的哪个partition中
每⼀条消息都是以(key,value)格式 Key是由⽣产者发送数据传⼊所以⽣产者(key)决定了数据产⽣到集群的哪个partition
33、kafka consumer 什么情况会触发再平衡reblance?
①⼀旦消费者加⼊或退出消费组,导致消费组成员列表发⽣变化,消费组中的所有消费者都要执⾏再平衡。
②订阅主题分区发⽣变化,所有消费者也都要再平衡。
34、描述下kafka consumer 再平衡步骤?
①关闭数据拉取线程,情空队列和消息流,提交偏移量;
②释放分区所有权,删除zk中分区和消费者的所有者关系;
③将所有分区重新分配给每个消费者,每个消费者都会分到不同分区;
④将分区对应的消费者所有关系写⼊ZK,记录分区的所有权信息;
⑤重启消费者拉取线程管理器,管理每个分区的拉取线程。
以上Kafka⾯试题部分来⾃⽹络,答案仅供参考,如果有不同的看法可以留⾔讨论。死记硬背的⽅式不建议。如果您最近有⾯试到关于Kafka 的⾯试题,欢迎留⾔分享哦~
下⾯这份是我找到的另⼀篇Kafka⾯试资料,有需要的话点赞+关注,私信我就能获取啦!