Kafka系列 —— Kafka消费语义分析&分区策略解读

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lemonZhaoTao/article/details/86670830

Kafka系列文章:
Kafka系列 —— 入门及应用场景 & 部署 & 简单测试
Kafka系列 —— Kafka核心概念
Kafka系列 —— Kafka常用命令
Kafka系列 —— Kafka监控

Kafka消费语义分析

通常架构:Flume --> Kafka --> Spark Srteaming

  • Flume作为Kafka的生产者
  • Spark Streaming作为Kafka的消费者

对于Flume来说:

  • source:CDH NameNode的log(本次案例)
  • sink:kafka

3种消费语义

  • at most once
    最多一次,消息可能丢失,但是不会重复投递
  • at least once
    至少一次,消息不会丢失,但是可能重复投递
    确保消息发送成功之后才进行消费,如果没有发送成功会继续发送,因此会导致重复消费的情况发生;ack=all
  • exactly once
    正好一次,消息不会丢失,也不会重复(这才是我们真正想要的)
    幂等性
    0.10.0.1版本,无法实现该语义,本次案例使用的版本
    0.11版本,官方已经说是支持该语义了(需要自己去进行测试)
    Kafka 0.11.X 版本关于支持exactly once的说明:
    在这里插入图片描述
    网址:http://kafka.apache.org/0110/documentation.html

commit&offset
Producer:
生产者进行发送消息,有个commit的概念
如果commit成功,那意味着消息不会丢失
如果commit失败,那意味着消息会丢失

Consumer:
消费者进行消费消息,有个offset的概念,通常来说offset是由consumer自己来维护的
消息被消费之后,标记到最新的被消费消息的位置,表明消息已经被使用了
1,2,3,4 总共4条消息
0,1,2,3 每条消息的下标,消费被消息之后,offset会进行更新维护
offset的维护分好几种,后面文章会进行详细介绍

不维护offset带来的影响
Offset如果没有维护,这时spark streaming挂了(即consumer挂了),那么重新被启动的consumer就会从上一次所更新的offset去消费,导致重复消费
举例:
读了100条数据,消费了50条,还没来得及回写确认的动作(100条处理完了,才去更新offset,因此offset也没有来得及更新),突然consumer挂了;重启consumer之后,还是从0开始进行消费,因此数据就会被重复消费(因此在该例子中重新启动的consumer是从0开始消费的)
数据重复了,该怎么办呢? ==> 这是需要进行思考的点

Kafka分区策略

工作中用的不多,但是在面试中经常被问到,以kafka 0.10.0.1版本为例,通过源码去解析:
https://github.com/apache/kafka/blob/0.10.0.1/core/src/main/scala/kafka/producer/DefaultPartitioner.scala
在这里插入图片描述
通过源码可以发现,kafka的分区策略为:hash(key) % partitions
对key取hash,然后与topic的分区数量取模,从而得到对应的数据(即消息)应该去哪个对应的分区

代码:
老的路径:kafka.producer.DefaultPartitioner.scala
新的路径(0.10.0.0版本之后):org.apache.kafka.clients.producer.internals.DefaultPartitioner

猜你喜欢

转载自blog.csdn.net/lemonZhaoTao/article/details/86670830