kafka数据消费的通俗理解(大数据五十三)
kafka数据消费的通俗理解(大数据五十三)consumer( 消费者 ) :负责从对应 Topic 获取数据的进程。Producer( 生产者 ) :负责将数据发送到 Kafka 对应 Topic 的进程。Message( 消息 ) :传递的数据对象,主要由四部分构成: offset( 偏移量 ) 、 key 、 value 、 timestamp( 插入时间 ) ; 其中 offset 和 timestamp 在 kafka 集群中产生, key/value 在 producer 发送数据的时候产生Broker( 代理者 ) : Kafka 集群中的机器 / 服务被成为 broker , 是一个物理概念。Partition( 分区 ) :具体维护 Kafka 上的消息数据的最小单位,一个 Topic 可以包含多个分区; Partition 特性: ordered & immutable 。 ( 在数据的产生和消费过程中,
【导读:数据是二十一世纪的石油,蕴含巨大价值,这是·情报通·大数据技术系列第[53]篇文章,欢迎阅读和收藏】
1 基本概念
Partition : topic 中的数据分割为一个或多个 partition 。每个 topic 至少有一个 partition 。每个 partition 中的数据使用多个 segment 文件存储。 partition 中的数据是有序的, partition 间的数据丢失了数据的顺序。如果 topic 有多个 partition ,消费数据时就不能保证数据的顺序。在需要严格保证消息的消费顺序的场景下,需要将 partition 数目设为 1 。 partition 是 kafka 消息队列组织的最小单位,一个 partition 可以看做是一个 FIFO 的队列。
2 术语解释
FIFO:First Input First Output 的缩写,先入先出队列,这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令。
Topic : 在 Kafka 中,使用一个类别属性来划分数据的所属类,划分数据的这个类称为 topic 。如果把 Kafka 看做为一个数据库, topic 可以理解为数据库中的一张表, topic 的名字即为表名。
Message( 消息 ) :传递的数据对象,主要由四部分构成: offset( 偏移量 ) 、 key 、 value 、 timestamp( 插入时间 ) ; 其中 offset 和 timestamp 在 kafka 集群中产生, key/value 在 producer 发送数据的时候产生
Broker( 代理者 ) : Kafka 集群中的机器 / 服务被成为 broker , 是一个物理概念。
Partition( 分区 ) :具体维护 Kafka 上的消息数据的最小单位,一个 Topic 可以包含多个分区; Partition 特性: ordered & immutable 。 ( 在数据的产生和消费过程中,不需要关注数据具体存储的 Partition 在那个 Broker 上,只需要指定 Topic 即可,由 Kafka 负责将数据和对应的 Partition 关联上 ) 。
Producer( 生产者 ) :负责将数据发送到 Kafka 对应 Topic 的进程。
consumer( 消费者 ) :负责从对应 Topic 获取数据的进程。
Consumer Group( 消费者组 ) :每个 consumer 都属于一个特定的 group 组,一个 group 组可以包含多个 consumer ,但一个组中只会有一个 consumer 消费数据。
3 Partition 与消费者的对应关系
1 个 partition 只能被同组的一个 consumer 消费,同组的 consumer 则起到均衡效果。
3.1 消费者多于 partition
topic : test 只有一个 partition创建一个 topic——test ,
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
在 g2 组中启动两个 consumer ,
1. bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning --consumer.config config/consumer_g2.properties
2. bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning --consumer.config config/consumer_g2.properties
消费者数量为 2 大于 partition 数量 1 ,此时 partition 和消费者进程对应关系如下:
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group g2
TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
test 0 9 9 0 consumer-1-4a2a4aa8-32f4-4904-9c16-1c0bdf7128a2 /127.0.0.1 consumer-1
- - - - - consumer-1-fd7b120f-fd21-4e07-8c23-87b71c1ee8a5 /127.0.0.1 consumer-1
消费者 consumer-1-fd7b120f-fd21-4e07-8c23-87b71c1ee8a5 无对应的 partition 。
用图表示为
生产者消费者对应关系 1
如上图,向 test 发送消息: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
只有 C1 能接收到消息, C2 则不能接收到消息, 即同一个 partition 内的消息只能被同一个组中的一个 consumer 消费。当消费者数量多于 partition 的数量时,多余的消费者空闲。
也就是说如果只有一个 partition 你在同一组启动多少个 consumer 都没用, partition 的数量决定了此 topic 在同一组中被可被均衡的程度,例如 partition=4 ,则可在同一组中被最多 4 个 consumer 均衡消费。
3.2 消费者少于和等于 partition
topic : test2 包含 3 个 partition
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 3 --topic test2
开始时,在 g3 组中启动 2 个 consumer
1.bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test2 --from-beginning --consumer.config config/consumer_g3.properties
2.bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test2 --from-beginning --consumer.config config/consumer_g3.properties
则对应关系如下:
TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
test2 0 8 8 0 consumer-1-8b872ef7-a2f0-4bd3-b2a8-7b26e4d8ab2c /127.0.0.1 consumer-1
test2 1 7 7 0 consumer-1-8b872ef7-a2f0-4bd3-b2a8-7b26e4d8ab2c /127.0.0.1 consumer-1
test2 2 8 8 0 consumer-1-f362847d-1094-4895-ad8b-1e1f1c88936c /127.0.0.1 consumer-1
其中, consumer-1-8b872ef7-a2f0-4bd3-b2a8-7b26e4d8ab2c 对应了 2 个 partition用图表示为:
生产者消费者对应关系 2
消费者数量 2 小于 partition 的数量 3 ,此时,向 test2 发送消息 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
C1 接收到 1 , 3 , 4 , 6 , 7 , 9
C2 接收到 2 , 5 , 8
此时 P1 、 P2 对对应 C1 ,即多个 partition 对应一个消费者, C1 接收到消息量是 C2 的两倍
然后,在 g3 组中再启动一个消费者,使得消费者数量为 3 等于 topic2 中 partition 的数量
3.bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test2 --from-beginning --consumer.config config/consumer_g3.properties
对应关系如下:
TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
test2 0 8 8 0 consumer-1-8b872ef7-a2f0-4bd3-b2a8-7b26e4d8ab2c /127.0.0.1 consumer-1
test2 1 7 7 0 consumer-1-ab472ed5-de11-4e56-863a-67bf3a3cc36a /127.0.0.1 consumer-1
test2 2 8 8 0 consumer-1-f362847d-1094-4895-ad8b-1e1f1c88936c /127.0.0.1 consumer-1
此时, partition 和消费者是一对一关系,向 test2 发送消息 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
C1 接收到了: 2 , 5 , 8
C2 接收到了: 3 , 6 , 9
C3 接收到了: 1 , 4 , 7
C1 , C2 , C3 均分了 test2 的所有消息,即 消息在同一个组之间的消费者之间均分了 !
3.3 多个消费者组
启动 g4 组,仅包含一个消费者 C1 ,消费 topic2 的消息,此时消费端有两个消费者组
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test2 --from-beginning --consumer.config config/consumer_g4.properties --delete-consumer-offsets
g4 组的 C1 的对应了 test2 的所有 partition:
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group g4
TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
test2 0 36 36 0 consumer-1-befc9234-260d-4ad3-b283-b67a2bf446ca /127.0.0.1 consumer-1
test2 1 35 35 0 consumer-1-befc9234-260d-4ad3-b283-b67a2bf446ca /127.0.0.1 consumer-1
test2 2 36 36 0 consumer-1-befc9234-260d-4ad3-b283-b67a2bf446ca /127.0.0.1 consumer-1
用图表示为
生产者消费者对应关系 3
如上图,向 test2 发送消息 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
那么 g3 组各个消费者及 g4 组的消费者接收到的消息是怎样地呢?欢迎思考!!
答案:消息被 g3 组的消费者均分, g4 组的消费者在接收到了所有的消息。
g3 组:
C1 接收到了: 2 , 5 , 8
C2 接收到了: 3 , 6 , 9
C3 接收到了: 1 , 4 , 7
g4 组:
C1 接收到了: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
启动多个组,则会使同一个消息被消费多次