Kafka常识总结

1. Kafka的用途、使用场景?

用途:异步、解耦、削峰、提速、广播

场景:消息,网站活动追踪,监测指标,日志聚合,流处理,事件采集,提交日志等

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

  • ISR:与leader保持同步的follower集合, 副本同步队列
  • AR:分区的所有副本

ISR:是由leader维护,follower从leader同步数据有一些延迟(包括延迟时间和延迟条数两个维度, 0.10.x版本之后只支持延迟时间),任意一个超过阈值都会把follower剔除出ISR, 存入OSR(Outof-Sync Replicas)列表,新加入的follower也会先存放在OSR中。AR=ISR+OSR。

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

  • LEO:LogEndOffset 当前日志文件中下一条待写信息的offset
  • HW:High Watermark,取 partition 对应的 ISR中 最小的 LEO 作为 HW,consumer 最多只能消费到 HW 所在的位置上一条信息。
  • HW/LEO这两个都是指最后一条的下一条的位置而不是指最后一条的位置。
  • LSO:Last Stable Offset 对未完成的事务而言,LSO 的值等于事务中第一条消息的位置(firstUnstableOffset),对已完成的事务而言,它的值同 HW 相同
  • LW:Low Watermark 低水位, 代表 AR 集合中最小的 logStartOffset 值

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

kafka每个partition中的消息在写入时都是有序的,消费时,每个partition只能被group中的一个消费者消费,保证了消费时也是有序的。

整个topic不保证有序。如果为了保证topic整个有序,那么将partition调整为1.

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

拦截器->序列化器->分区器

拦截器是在kafka0.10.0.0版本中就已经引入的一个功能,kafka一共有两种拦截器。生产者拦截器和消费者拦截器。生产者拦截器可以用来在消息发送前做一些准备工作,比如按照某个规则过滤不符合要求的消息,修改消息的内容等,也可以用来在发送回调逻辑前做一些定制化的需求。

生产者需要用序列化器将对象转换成字节数组才能通过网络发送给kafka.当然消费者需要用对应的反序列化器将kafka的字节数组转换为相应的对象。

消息通过send()方法发送broker的过程中,有可能会经过拦截器,序列化器,之后,就会需要确定消息要发往的分区。如果ProducerRecord中指定了partition字段,那么就不需要分区器的作用。因为partition代表的就是索要发往的分区号。

6.一个消费者组中消费者个数的限制:

正常情况下一个消费者组中的消费者个数不能超过所消费Topic的分区数。但是也可以通过自定义分区分配策略,将一个consumer指定消费所有partition。

7. Kafka生产者客户端中使用了几个线程来处理?分别是什么?

2个,主线程和Sender线程。主线程负责创建消息,然后通过分区器、序列化器、拦截器作用之后缓存到累加器RecordAccumulator中。Sender线程负责将RecordAccumulator中消息发送到kafka中.

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

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

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

10. 消费者与消费组之间的关系

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

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

创建:在zk上/brokers/topics/下节点 kafkabroker会监听节点变化创建主题

删除:调用脚本删除topic会在zk上将topic设置待删除标志,kafka后台有定时的线程会扫描所有需要删除的topic进行删除

12. kafka的topic的分区数怎么增加?

可以

kafka-topics.sh --alter --zookeeper hdc-data1,hdc-data2,hdc-data3:2181 --topic prod_log_simul --partitions 3

13. topic的分区数可不可以减少?

不可以。删掉之后分区中的数据不好处理,顺序性不好保证。

14. 创建topic时如何选择合适的分区数?

根据集群的机器数量和需要的吞吐量来决定适合的分区数

15. 优先副本有什么特殊的作用?

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

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

  1. 生产者的分区分配是指为每条消息指定其所要发往的分区。可以编写一个具体的类实现org.apache.kafka.clients.producer.Partitioner接口。
  2. 消费者中的分区分配是指为消费者指定其可以消费消息的分区。Kafka 提供了消费者客户端参数 partition.assignment.strategy 来设置消费者与订阅主题之间的分区分配策略。
  3. 分区副本的分配是指为集群制定创建主题时的分区副本分配方案,即在哪个 broker 中创建哪些分区的副本。kafka-topics.sh 脚本中提供了一个 replica-assignment 参数来手动指定分区副本的分配方案。

17. Kafka的日志目录结构

每个partition一个文件夹,包含四类文件*.index *.log *.timeindex leader-epoch-checkpoint

*.index *.log *.timeindex三个文件成对出现 前缀为上一个segment的最后一个消息的偏移 log文件中保存了所有的消息 index文件中保存了稀疏的相对偏移的索引 timeindex保存的则是时间索引

leader-epoch-checkpoint中保存了每一任leader开始写入消息时的offset 会定时更新

follower被选为leader时会根据这个确定哪些消息可用

18. 指定了一个offset,Kafka怎么查找到对应的消息?

  1. 通过文件名前缀数字x找到该绝对offset 对应消息所在文件
  2. offset减去x为在文件中的相对偏移
  3. 通过index文件中记录的索引找到最近的消息的位置
  4. 从最近位置开始逐条寻找

19. Kafka的那些设计让它有如此高的性能?

零拷贝,页缓存,顺序写

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值