kafka面试题15道

 1、kafka消息发送的流程?

      kafka消息的发送主要涉及两个线程分别是main线程和sender线程。


       在main线程中,会由KafkaProducer创建消息,通过可能存在的拦截器、 序列化器、和分区器的作用后,缓存到消息累加器(RecrdAccumlator)中,在消息累加器中,每一个分区对应一个双端队列,当每个分区的消息会放入对应的双端队列,当batch.size到达16k或到达linger.ms设置的时间后,会由sender线程读取。

       Sender线程在从消息累加器中读取到消息后,会创建发送的请求,kafka集群的每一个broker都会有一个InFlightRequests队列存在于NetWorkClient中,一般情况下,每个InFlightRequests队列缓存5个请求,这些请求通过selector发送到kafka集群,当集群返回acks信息后,Producer根据应答将数据存入磁盘。

2、Kafka 的设计架构你知道吗?

Producer:消息生产者,就是向 Kafka broker 发消息的客户端。 
Consumer:消息消费者,向 Kafka broker 取消息的客户端。 
Consumer Group(CG):消费者组,由多个 consumer 组成。
消费者组内每个消 费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;
消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者 
Broker:一台 Kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个 broker 可以容纳多个 topic。 
Leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是leader。
Follower:每个分区多个副本中的“从”,实时从 Leader 中同步数据,保持和 Leader 数据的同步。
Leader 发生故障时,某个 Follower 会成为新的 Leader。

3、Kafka 分区的目的?

  (1)便于合理使用存储资源, 可以把海量的数据按照分区切割成一块一块数据存储在多台Broker上。合理控制分区的任务,可以实现负载均衡的效果。

2)提高并行度,(类似java的多线程)多个分区共同处理同一组数据,能大幅度提高效率。

   

4、你知道 Kafka 是如何做到消息的有序性?

  (1)消息分区,kafka将同一个topic的数据分散存储在多个partition中,在每个partition中,都会有自己的offset偏移量,这是一条消息在分区中的唯一标识符,kafka会通过offset偏移量确保每个分区内部的消息存储顺序是有序的。

(2)生产者端(producer),生产者发送信息数据时,可以指定分区,也可以有kafka自动选择分区。当生产者使用同步发送方式将消息发送到指定的分区时,kafka会按照消息发送的顺序依次将它们写入到目标分区中。

(3)消费者端(Consumer),消费者从kafka急群中中读取消息时,会从指定的offset偏移量处开始读取,并发送给客户端。在消费者组消费场景下,kafka还会对多个消费者之间的消息进行协调,确保每条消息只能被其中一个消费者处理,并且每个消费者只能读取到特定分区内的消息,这样就保证了消费者端的有序性。


5、ISR、OSR、AR 是什么?

     Kafka 分区中的所有副本统称为 AR(Assigned Repllicas)。

             AR = ISR + OSR

     ISR,还存活的所有副本(Leader + Follower)

     OSR, ISR队列踢出的所有副本(故障的Leader 和 长时间未向 Leader 发送通信请求或同步 数据的Follower)。


6、Kafka 在什么情况下会出现消息丢失

 

       在Leader发生故障时,会从ISR队列中还存活的副本中选出一个新的Follower作为Leader

为了保证FollowerLeader的数据的一致性,各个Follower会将各自的log文件中高于HW的部分

截掉,然后从新的Leader中同步数据,如果新的LeaderLEO是偏小的,那么就会出现数据丢失的情况。


7、怎么尽可能保证 Kafka 的可靠性

ACK级别设置为-1 + 分区副本大于等于2 + ISR里应答的最小副本数量大于等于2

acks=0,生产者发送信息数据就不管了,可靠性差,效率高;

acks=1,生产者发送数据,Leader读取后应答,可靠性中等,效率中等;

acks=-1,生产者发送过来数据Leader和ISR队列里面所有Follwer都存储后才能应答,可靠性高,效率低,且有可能出现数据重复问题。

在生产环境中,acks=0很少使用;acks=1,一般用于传输普通日志,允许丢个别数据;

acks=-1,一般用于传输和钱相关的数据,对可靠性要求比较高的场景。


8、Kafka中如何做到数据唯一,即数据去重?

幂等性  Producer不论向Broker发送多少次重复数据,Broker端都只会持久化一条

开启幂等性后,会根据<PID, Partition, SeqNumber>判断是否是重复数据,遇到重复数据,Broker只会持久化一条。其 中PID是Kafka每次重启都会分配一个新的;Partition 表示分区号;Sequence Number是单调自增的。(幂等性只能保障服务器不挂掉的情况下,发送数据是唯一的)。

事务 类似sql中的事务,在启用事务前,需要自定义一个transaction_id,服务器重启后也可以根据transaction_id继续处理未处理完的事务。

     


9、生产者如何提高吞吐量

(1)batch.size:批次大小,默认16k

(2)linger.ms:等待时间,修改为5-100ms

(3)compression.type:压缩snappy

(4) RecordAccumulator:缓冲区大小,修改为64m


10、zk在kafka集群中有何作用?

  1. 配置管理:Kafka使用ZooKeeper来管理和存储集群的配置信息,包括broker的地址、topic的分区信息等。

  2. Leader选举:Kafka 集群中有一个 broker 的 Controller 会被选举为 Controller Leader,负责管理集群broker 的上下线。

  3. Broker注册:Kafka的broker在启动时会向ZooKeeper注册自己的信息,包括broker的ID、地址等。其他组件如生产者、消费者可以通过ZooKeeper获取到可用的broker列表,以便进行消息的发送和接收。

  4. Topic和分区管理:ZooKeeper存储了Kafka中所有topic和分区的元数据信息,包括topic的名称、分区的数量、分区的副本分配等。


11、简述kafka集群中的Leader选举机制

  当一个分区的Leader不可用时,Kafka会自动触发选举新的Leader。选举的前提是

ISR队列中存活,然后根据在AR队列的前后顺序来选举。


12、kafka是如何处理数据乱序问题的。

kafka在1.x版本之前保证数据单分区有序,条件如下:

      max.in.flight.requests.per.connection=1(不需要考虑是否开启幂等性)

     一个队列只有一个请求,就不会出现乱序。

 

kafka在1.x及以后版本保证数据单分区有序,条件如下:

开启幂等性

         max.in.flight.requests.per.connection需要设置小于等于5

未开启幂等性

max.in.flight.requests.per.connection需要设置为1


13、kafka中节点如何服役和退役

服役:

        修改新节点的配置文件并启动该节点,创建一个topics-to-move.json的文件,里面存放

        要负载均衡的主题,运行kafka自带的kafka-reassign-partitions.sh脚本,指定服务器的节点,生成负载均衡计划(负载均衡计划也可以自定义)

       创建increase-replication-factor.json副本存储计划的json文件,将生成的负载均衡计划填入该文件,运行kafka-reassign-partitions.sh脚本,执行副本存储计划文件即可。

bin/kafka-reassign-partitions.sh --bootstrap-server hadoop11:9092 --topics-to-move-json-file topics-to-move.json --broker-list "0,1,2" --generate

退役:

    过程与服役的过程一致,只是服役时是运行kafka-reassign-partitions.sh脚本时,增加节点数量,退役时是,剔除要退役的节点。


14、Kafka中Leader挂了,Follower挂了,然后再启动,数据如何同步?

   Follower挂了后,会被临时踢出ISR队列,在这个期间其他的Leader和Follower继续接收数据,

等到该宕机的Follower重启后,会读取磁盘中上次记录的HW,将log中高于HW的部分截掉,从

HW继续同步Leader的数据,等到该Follower的LEO高于该partition的HW时,即Follower追上Leder时,就可重新加入ISR队列。


15、kafka中初始化的时候Leader选举有一定的规律,如何打破这个规律呢?

 左:kafka自带代码规则创建的 分区副本                 右:自定义负载均衡计划创建的分区副本

          手动调整分区副本存储,选择一个要负载均衡的主题,自定义负载均衡计划, 之后运行kafka-reassign-partitions.sh脚本并指定自定义的负载均衡计划,这样该主题的各个分区的leader就会改变。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
面试官问到大数据Kafka面试,可能会涉及以下几个方面的内容: 1. Kafka的基本概念和特点: - Kafka是一个分布式流处理平台,用于高吞吐量的实时数据传输。 - Kafka采用发布-订阅模式,消息以topic为单位进行发布和订阅。 - Kafka具有高可靠性、可扩展性和持久性等特点。 2. Kafka的架构和组件: - Kafka集群由多个broker组成,每个broker负责存储和处理消息。 - 每个topic可以分为多个分区,每个分区可以在不同的broker上进行复制。 - 生产者将消息发布到指定的topic,消费者从指定的topic订阅消息。 3. Kafka的消息传输和存储: - Kafka使用消息日志的方式存储消息,每个分区都有一个对应的日志文件。 - 生产者将消息追加到分区的日志文件末尾,消费者按照偏移量顺序读取消息。 - Kafka支持消息的持久化存储,并且可以根据配置进行数据的保留和清理。 4. Kafka的高可用和容机制: - Kafka通过副本机制实现高可用性,每个分区可以有多个副本。 - 副本之间通过ISR(In-Sync Replicas)机制保持同步,确保数据的一致性。 - 当某个broker宕机时,Kafka会自动将其上的分区副本迁移到其他可用的broker上。 5. Kafka的性能调优和监控: - 可以通过调整Kafka的参数来提高性能,如调整分区数、批量发送消息等。 - 监控Kafka集群的健康状态,包括吞吐量、延迟、存储空间等指标。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值