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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值