大数据-kafak常见面试题

本文详细介绍了Kafka的事务定义(atmostonce、atleastonce、exactlyonce)、节点存活检查条件、消息文件格式、高效存储设计、分区数据存储、ack机制、消费者消费策略、ISR概念以及Zookeeper角色。此外,还探讨了如何提升生产者速度、消费慢的解决方案和处理分区lag的方法。

1. kafka数据传输的事务定义有哪三种?

① 最多一次(at most once):消息不会被重复发送,最多被传输一次,但也有可能一次都不传输

② 最少一次(at leatest once):消息不会被漏发,最少被传输一次,但也有可能被重复传输

③精确一次(exactly once):不会漏传输也不会重复传输,每个消息都传输一次且有且仅有一次。

2. kafka判断一个节点是否还活着有哪两个条件?

① 节点必须可以和zk相连,zk通过心跳机制检查每个节点的状态

② 如果节点是个follower,则它必须能够及时的同步leader的写操作,并且延时不能太久

3. kafka存储在硬盘上的消息格式是什么?

消息是由一个固定长度的头部和可变长度的字节数组组成。头部包含了一个版本号和CRC32校验码。

①消息长度:4byte(value: 1+4+n)

②版本号:1 byte

③CRC校验码:4 byte

④具体的消息:n byte

4. kafka高效文件存储设计特点

① kafka把topic中的一个parition大文件拆分成多个小文件段,通过多个小文件段,就容易定期清理消费完成文件,减少磁盘的占用;

② 通过索引信息可以快速定位message和确定response的最大大小

③通过index元数据全部映射到memory,可以避免segment file 的IO磁盘操作

④ 通过索引文件稀疏存储,可以大幅降低index文件元数据占用空间

5. kafka Partition的数据如何保存到硬盘

① topic中发多个partition以文件夹的形式保存到broker中,每个分区序号从0递增,且消息有序

② partition文件下有多个segment(xxx.index,xxx.log)

③ segment文件里的大小和配置文件大小一致可以根据要求修改,默认为1G

④如果大小大于1G时,会滚动生成一个新的segment并且以上一个segment最后一条消息的偏移量命名

6. kafka的ack机制

request.required.acks有三个值 0 1 -1
0:生成者不会等待broker的ack,这个延迟最低但是存储保证最弱,当server挂掉时就会丢失数据
1:服务端会等待ack值,leader副本确认收到消息后发送ack,但是leader挂掉后不能确保是否复制完成的新leader也会导致数据丢失
-1:同样在1的基础上,服务端会等待所有的follower的副本都接收到数据后才会收到leader发出的ack,这样数据就不会丢失。

7. kafka消费者如何消费数据

消费者每次消费数据时,都会记录消费的物理偏移量(offset)。等到下次消费时接着从上次的位置消费数据。

8. 消费者负载均衡策略

一个消费者组中的一个分片对应一个消费者组成员,也就是一个分片数据只能被消费者组中的一个消费者消费。但它会尽可能的将数据分发给多个消费者,如果消费者组中的消费者过多,则会有空闲的成员。成员过少,那么有可能消费者消费多个分区的数据。但分区数据尽可能使采用轮询的方式。

9. kafka消费数据的有序性说明

kafka保证数据在一个消费者组内部它是有序的,消费者组与消费者组之间是无序的;

kafka保证同一个partition中,保证数据能够先进先出顺序消费,所以在数据写入时,可以按照key hash写入不同的partition中,保证数据key相同的写入同一个分区中。

10. 你怎么理解kafka ,kafka在大数据架构中承担了什么样的角色?

kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),该项目主要为了处理实时数据提供一个统一的、高吞吐的、低延迟的平台。

在实时数据开发过程中,它主要承担了一个统一的数据缓存和分发的的角色,类似于一个数据的总线的作用。在大批量的数据到来时,kafka可以凭借其高吞吐,高可靠性,对数据起到一个削峰填谷的作用,保证系统的稳定性。同时kafka也能够接受各种各样的数据源,最终汇总到一起,经过处理后发送不同的系统中。

11. kafka 解释下ISR?

Leader 维护了一个动态的 in-sync replica set (ISR),意为和 leader 保持同步的 follower 集合。当 ISR 中的 follower 完成数据的同步之后, leader 就会给 follower 发送 ack。如果 follower长 时 间 未 向 leader 同 步 数 据 , 则 该 follower 将 被 踢 出 ISR , 该 时 间 阈 值 由replica.lag.time.max.ms 参数设定。Leader 发生故障之后,就会从 ISR 中选举新的 leader。

12. kafka 中zk在其中作用?

Kafka 集群中有一个 broker 会被选举为 Controller,负责管理集群 broker 的上下线,所有 topic 的分区副本分配和 leader 选举等工作。Controller 的管理工作都是依赖于 Zookeeper 的。

13. kafka producer 生产者加快速度?

  1. 新增topic分区数,创建多个生产者
  2. 批量提交消息

14. kafka 为什么不支持读写分离?

在 Kafka 中,生产者写入消息、消费者读取消息的操作都是与 leader 副本进行交互的,从 而实现的是一种主写主读的生产消费模型。

15. kafka leader crash 时 ,isr为空怎么办?

kafka在Broker端提供了一个配置参数:unclean.leader.election,这个参数有两个值:
true(默认):允许不同步副本成为leader,由于不同步副本的消息较为滞后,此时成为leader,可能会出现消息不一致的情况。
false:不允许不同步副本成为leader,此时如果发生ISR列表为空,会一直等待旧leader恢复,降低了可用性。

16. kafka原理

kafka是一个基于Zookeeper的高吞吐量低延迟的分布式的发布与订阅消息系统,它可以实时处理大量的消息数据以满足各种需求。

kafka通过生产者生产消息,push推模式存入到broke中相应的topic中,消费者消费topic中的数据采用了pull拉取模式。

一个典型的Kafka集群中包含若干生产者(数据可以是web前端产生的页面内容或者服务器日志等),若干Broker,若干消费者(可以是Hadoop集群,实时监控程序,数据仓库或其它服务)以及一个Zookeeper集群。Zookeeper集群用于管理和协调Broker。当Kafka系统中新增了Broker或者每个Broker故障实现时,Zookeeper通知生产者和消费者。生产者和消费者据此开始和其它的B roker协调作用。

kafka的集群架构如下图所示,生产者使用push模式将消息发送到Broker,而消费者使用pull模式从Broker订阅消费消息.

17. kafka消费慢怎么解决?

一般 kafka 消费慢的 解决思路有一下几种:

  1. 增加分区数
  2. 批量消费(增加拉取批次, 默认 500)
  3. 每次拉取后,本地启线程池异步消费 (注意 kafkaConsumer 是 非线程安全的)
  4. 如果消费多个topic的话,修改分区策略为 StickyAssignor.class(默认 RangeAssignor.class)

说明:StickyAssignor分配策略
“sticky”这个单词可以翻译为“粘性的”,Kafka从0.11.x版本开始引入这种分配策略,它主要有两个目的:

分区的分配要尽可能的均匀;
分区的分配尽可能的与上次分配的保持相同。
当两者发生冲突时,第一个目标优先于第二个目标。

18. kafka某个分区lag较大,怎么解决?

消息堆积是消费滞后(Lag)的一种表现形式,消息中间件服务端中所留存的消息与消费掉的消息之间的差值即为消息堆积量,也称之为消费滞后(Lag)量。对于Kafka而言,消息被发送至Topic中,而Topic又分成了多个分区(Partition),每一个Partition都有一个预写式的日志文件,虽然Partition可以继续细分为若干个段文件(Segment),但是对于上层应用来说可以将Partition看成最小的存储单元(一个由多个Segment文件拼接的“巨型文件”)。每个Partition都由一系列有序的、不可变的消息组成,这些消息被连续的追加到Partition中。

LogStartOffset:表示一个Partition的起始位移,初始为0,虽然消息的增加以及日志清除策略的影响,这个值会阶段性的增大。
ConsumerOffset:消费位移,表示Partition的某个消费者消费到的位移位置。
HighWatermark:简称HW,代表消费端所能“观察”到的Partition的最高日志位移,HW大于等于ConsumerOffset的值。
LogEndOffset:简称LEO, 代表Partition的最高日志位移,其值对消费者不可见。比如在ISR(In-Sync-Replicas)副本数等于3的情况下(如下图所示),消息发送到Leader A之后会更新LEO的值,Follower B和Follower C也会实时拉取Leader A中的消息来更新自己,HW就表示A、B、C三者同时达到的日志位移,也就是A、B、C三者中LEO最小的那个值。由于B、C拉取A消息之间延时问题,所以HW必然不会一直与Leader的LEO相等,即LEO>=HW。

  • 使用kafka消费数据的时候,需要对offset的lag值进行实时监控,以确认消费速度是否ok
  • 调用KafkaStream的iterator消费线程必须catch住异常,否则抛出了异常,就停止消费了。

综上可得:造成某个分区lag较大可能是因为数据写入时候不均匀导致,某个分区数据写入过多,另一个可能是消费这个分区的消费者出现异常,没有进行捕捉导致消费者进行重试,消费lag偏大。解决办法:数据写入时候均匀写入以及catch异常消费数据,保证消费者正常消费。

参考:https://segmentfault.com/a/1190000012613987

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值