Kafka 大厂面试题

9,521 阅读4分钟

这是我参与更文挑战的第25天,活动详情查看:更文挑战

1 Kafka单条日志传输大小

Kafka对于消息体的大小默认为单条最大值是1M但是在我们应用场景中,常常会出现一条消息大于1M,如果不对Kafka进行配置。则会出现生产者无法将消息推送到Kafka或消费者无法去消费Kafka里面的数据,这时我们就要对Kafka进行以下配置:server.properties
replica.fetch.max.bytes: 1048576 broker可复制的消息的最大字节数, 默认为1M
message.max.bytes: 1000012 kafka 会接收单个消息size的最大限制, 默认为1M左右
注意:message.max.bytes必须小于等于``replica.fetch.max.bytes,否则就会导致replica之间数据同步失败。

2 Kafka过期数据清理

保证数据没有被引用(没人消费他)
日志清理保存的策略只有delete和compact两种
log.cleanup.policy = delete启用删除策略
log.cleanup.policy = compact启用压缩策略

3 Kafka可以按照时间消费数据

Map<TopicPartition, OffsetAndTimestamp> startOffsetMap = KafkaUtil.fetchOffsetsWithTimestamp(topic, sTime, kafkaProp);

4 Kafka消费者角度考虑是拉取数据还是推送数据

拉取数据

5 Kafka分区分配策略

在 Kafka内部存在两种默认的分区分配策略:Range和 RoundRobin。

Range是默认策略。Range是对每个Topic而言的(即一个Topic一个Topic分),首先对同一个Topic里面的分区按照序号进行排序,并对消费者按照字母顺序进行排序。然后用Partitions分区的个数除以消费者线程的总数来决定每个消费者线程消费几个分区。如果除不尽,那么前面几个消费者线程将会多消费一个分区。

例如:我们有10个分区,两个消费者(C1,C2),3个消费者线程,10 / 3 = 3而且除不尽。
C1-0 将消费 0, 1, 2, 3 分区
C2-0 将消费 4, 5, 6 分区
C2-1 将消费 7, 8, 9 分区

第一步:将所有主题分区组成TopicAndPartition列表,然后对TopicAndPartition列表按照hashCode进行排序,最后按照轮询的方式发给每一个消费线程。

6 Kafka挂掉

  1. Flume记录
  2. 日志有记录
  3. 短期没事

7 Kafka丢不丢数据

  1. Ack = 0,相当于异步发送,消息发送完毕即offset增加,继续生产。
  2. Ack = 1,leader收到leader replica 对一个消息的接受ack才增加offset,然后继续生产。
  3. Ack = -1,leader收到所有replica 对一个消息的接受ack才增加offset,然后继续生产。

8 Kafka数据重复

  1. 幂等性 + ack-1 + 事务
  2. Kafka数据重复,可以再下一级:SparkStreaming、redis或者Hive中dwd层去重,去重的手段:分组、按照id开窗只取第一个值;

9 Kafka消息数据积压,Kafka消费能力不足怎么处理?

  1. 如果是Kafka消费能力不足,则可以考虑增加Topic的分区数,并且同时提升消费组的消费者数量,消费者数 = 分区数。(两者缺一不可)
  2. 如果是下游的数据处理不及时:提高每批次拉取的数量。批次拉取数据过少(拉取数据/处理时间 < 生产速度),使处理的数据小于生产的数据,也会造成数据积压。

10 Kafka日志保存时间

默认保存7天;生产环境建议3天

11 Kafka中数据量计算

每天总数据量100g,每天产生1亿条日志,10000万/24/60/60=1150条/每秒钟
平均每秒钟:1150条
低谷每秒钟:50条
高峰每秒钟:1150条 *(2-20倍)= 2300条 - 23000条
每条日志大小:0.5k - 2k(取1k)
每秒多少数据量:2.0M - 20MB

12 Kafka的硬盘大小

每天的数据量100g * 2个副本 * 3天 / 70%

13 Kafka监控

公司自己开发的监控器
开源的监控器:KafkaManager、KafkaMonitor、KafkaEagle

14 Kakfa分区数

  1. 创建一个只有1个分区的topic
  2. 测试这个topic的producer吞吐量和consumer吞吐量。
  3. 假设他们的值分别是Tp和Tc,单位可以是MB/s。
  4. 然后假设总的目标吞吐量是Tt,那么分区数=Tt / min(Tp,Tc)

例如:producer吞吐量 = 20m/s;consumer吞吐量 = 50m/s,期望吞吐量100m/s;
分区数 = 100 / 20 = 5分区
分区数一般设置为:3-10个

15 多少个Topic

通常情况:多少个日志类型就多少个Topic。也有对日志类型进行合并的。

16 Kafka的ISR副本同步队列

  ISR(In-Sync Replicas),副本同步队列。ISR中包括Leader和Follower。如果Leader进程挂掉,会在ISR队列中选择一个服务作为新的Leader。有replica.lag.max.messages(延迟条数)和replica.lag.time.max.ms(延迟时间)两个参数决定一台服务是否可以加入ISR副本队列,在0.10版本移除了replica.lag.max.messages参数,防止服务频繁的进去队列。

  任意一个维度超过阈值都会把Follower剔除出ISR,存入OSR(Outof-Sync Replicas)列表,新加入的Follower也会先存放在OSR中。

17 Kafka的机器数量

Kafka机器数量 = 2 *(峰值生产速度 * 副本数 / 100)+ 1

18 副本数设定

一般设置成2个或3个,很多企业设置为2个。
副本的优势:提高可靠性;副本劣势:增加了网络IO传输