1 Kafka概述
1.1 Kafka是什么?
Kafka是一个分布式的基于发布订阅模式的消息队列,并且是消费者主动拉取模式的。
①什么是消息队列?
消息队列是一种异步处理的方式。
- 同步处理:相当于银行办理业务,需要你一直在那呆着。
- 异步处理:相当于修手表,先放在修理店,你可以去干其他的事情,过段时间来取。
消息队列具有解耦,可恢复,缓冲,灵活性高,异步处理等优点。
②消息队列的两种模式
一对一模式
每一个消费者都会对应一个消息队列
缺点:消息队列不能复用。用完就删除,如果有多个消费者同时消费,资源占用就比较大。
发布订阅模式
生产者将消息发布到Topic中,同时消费者会订阅这个Topic。
这里又有两种模式:
生产者主动推送模式,只要你订阅了这个Topic,就会将所有的消息推送给你。
消费速度,就由生产者决定。、
- 缺点:发送太多,可能存在自己不想要的消息。
消费者主动拉取模式,消费者主动的拉取自己的消息。
消费速度,由消费者决定。
- 缺点:消费者不知道消息队列中有没有消息,需要一直轮询的方式去查看是否有新的消息。
1.2 Kafka基础架构
一个消费者组内的不同的消费者可以订阅不同的topic!
- 如果是roundRobin:会乱了,某个消费者会分到自己没有订阅的消息。
- 如果是range:是根据主题划分!这样就不会出现乱了的现象。
①Topic、分区、副本
-
可以理解为一个队列,不同的类型。
-
对Topic话题进行分区
-
对每个Topic设置副本,不同的副本放到不同的机器上,多个副本中只能有一个为Leader,万一Leader挂掉了,Follower会重新选举为Leader。
MR分区:提高reducer端的并行度
hive分区:查询时可减少读取数据量
kafka分区:①提高一个Topic的负载均衡②提供并发度。
②消息流向
生产者生产消息 --> 发送给Leader --> Leader会发送给自己的ISR内的follower --> 再发给其他的follower --> 消费者消费消息。
生产的消息怎样选择进入哪个分区?
- 消息被封装成一个ProducerRecord对象,如果这个对象
- 指定了partition,那就去这个partition中;
- 没有指定partition,但是有key值,根据key值得hash对分区数取余
- 没有指定partition也没有指定key,轮询分到一个分区。
③消费者消费消息
- 消费者分为:单个消费者和消费者组
消费者组,由多个consumer组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。
④Zookeeper和Kafka
- Kafka的操作 元数据信息存储在Zookeeper中
-
消费者也会存一些消费的位置信息(偏移量),放到zookeeper中(而不是内存),这是0.9版本之前!
在0.9版本之后从新将offset存放在kafka本地。
-
kafka将数据存储到本地,因为含有index所以很快。
-
数据存放时间默认是7天,168h。
为什么改回存放到kafka本地呢?
- ①消费者既要与Kafka集群通信,又要与zookeeper通信。
- ②存到zookeeper中就需要与zookeeper频繁通信,增大了zk的压力。