Kafka03:【案例】Kafka的快速使用:Kafka中Topic的操作、Kafka中的生产者和消费者

一、Kafka中Topic的操作

kafka集群安装好了以后我们就想向kafka中添加一些数据
想要添加数据首先需要创建topic
那接下来看一下针对topic的一些操作

新增Topic:指定2个分区,2个副本,注意:副本数不能大于集群中Broker的数量

因为每个partition的副本必须保存在不同的broker,否则没有意义,如果partition的副本都保存在同一个broker,那么这个broker挂了,则partition数据依然会丢失。

在这里我使用的是3个节点的kafka集群,所以副本数我就暂时设置为2,最大可以设置为3。

如果你们用的是单机kafka的话,这里的副本数就只能设置为1了,这个需要注意一下。

1、创建Topic

[root@bigdata01 kafka_2.12-2.4.1]# bin/kafka-topics.sh --create --zookeeper localhost:2181  --partitions 2 --replication-factor 2 --topic hello
Created topic hello.

2、查询Topic

-查询Topic:查询Kafka中的所有Topic列表以及查看指定Topic的详细信息

(1)查询kafka中所有的topic列表

[root@bigdata01 kafka_2.12-2.4.1]# bin/kafka-topics.sh --list --zookeeper localhost:2181
hello

(2)查看指定topic的详细信息

[root@bigdata01 kafka_2.12-2.4.1]# bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic hello
Topic: hello    PartitionCount: 2       ReplicationFactor: 2    Configs: 
        Topic: hello    Partition: 0    Leader: 2       Replicas: 2,0      Isr: 2,0
        Topic: hello    Partition: 1    Leader: 0       Replicas: 0,1      Isr: 0,1

第一个行显示指定topic所有partitions的一个总结
PartitionCount:表示这个Topic一共有多少个partition
ReplicationFactor:表示这个topic中partition的副本因子是几
Config:这个表示创建Topic时动态指定的配置信息,在这我们没有额外指定配置信息

下面每一行给出的是一个partition的信息,如果只有一个partition,则只显示一行。
Topic:显示当前的topic名称
Partition:显示当前topic的partition编号
Leader:Leader partition所在的节点编号,这个编号其实就是broker.id的值,
来看这个图:
在这里插入图片描述
这个图里面的hello这个topic有两个partition,其中partition1的leader所在的节点是broker1,partition2的leader所在的节点是broker2

Replicas:当前partition所有副本所在的节点编号【包含Leader所在的节点】,如果设置多个副本的话,这里会显示多个,不管该节点是否是Leader以及是否存活。
Isr:当前partition处于同步状态的所有节点,这里显示的所有节点都是存活状态的,并且跟Leader同步的(包含Leader所在的节点)

所以说Replicas和Isr的区别就是
如果某个partition的副本所在的节点宕机了,在Replicas中还是会显示那个节点,但是在Isr中就不会显示了,Isr中显示的都是处于正常状态的节点。

修改Topic:修改Topic的partition数量,只能增加

为什么partition只能增加?
因为数据是存储在partition中的,如果可以减少partition的话,那么partition中的数据就丢了

3、增加Topic

[root@bigdata01 kafka_2.12-2.4.1]# bin/kafka-topics.sh --alter --zookeeper localhost:2181 --partitions 5 --topic hello
WARNING: If partitions are increased for a topic that has a key, the partition logic or ordering of the messages will be affected
Adding partitions succeeded!

修改之后再来查看一下topic的详细信息.。

[root@bigdata01 kafka_2.12-2.4.1]# bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic hello
Topic: hello    PartitionCount: 5       ReplicationFactor: 2    Configs: 
        Topic: hello    Partition: 0    Leader: 2       Replicas: 2,0       Isr: 2,0
        Topic: hello    Partition: 1    Leader: 0       Replicas: 0,1       Isr: 0,1
        Topic: hello    Partition: 2    Leader: 1       Replicas: 1,2       Isr: 1,2
        Topic: hello    Partition: 3    Leader: 2       Replicas: 2,1       Isr: 2,1
        Topic: hello    Partition: 4    Leader: 0       Replicas: 0,2       Isr: 0,2

4、删除Topic

删除Topic:删除Kafka中的指定Topic

[root@bigdata01 kafka_2.12-2.4.1]# bin/kafka-topics.sh --delete --zookeeper localhost:2181 --topic hello
Topic hello is marked for deletion.
Note: This will have no impact if delete.topic.enable is not set to true.

删除操作是不可逆的,删除Topic会删除它里面的所有数据

注意:Kafka从1.0.0开始默认开启了删除操作,之前的版本只会把Topic标记为删除状态,需要设置delete.topic.enable为true才可以真正删除

如果不想开启删除功能,可以设置delete.topic.enable为false,这样删除topic的时候只会把它标记为删除状态,此时这个topic依然可以正常使用。

delete.topic.enable可以配置在server.properties文件中。

在这里插入图片描述

二、Kafka中的生产者和消费者

前面我们学习了Kafka中的topic的创建方式,下面我们可以向topic中生产数据以及消费数据了
生产数据需要用到生产者
消费数据需要用到消费者

kafka默认提供了基于控制台的生产者和消费者,方便测试使用。

生产者:bin/kafka-console-producer.sh
消费者:bin/kafka-console-consumer.sh

先来看一下如何向里面生产数据
直接使用kafka提供的基于控制台的生产者
先创建一个topic【5个分区,2个副本】:

[root@bigdata01 kafka_2.12-2.4.1]# bin/kafka-topics.sh --create --zookeeper localhost:2181  --partitions 5 --replication-factor 2 --topic hello 
Created topic hello.

向这个topic中生产数据
broker-list:kafka的服务地址[多个用逗号隔开]、
topic:topic名称

[root@bigdata01 kafka_2.12-2.4.1]# bin/kafka-console-producer.sh --broker-list localhost:9092 --topic hello
>hehe

下面来创建一个消费者消费topic中的数据
bootstrap-server:kafka的服务地址
topic:具体的topic

[root@bigdata01 kafka_2.12-2.4.1]# bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic hello

发现消费不到刚才生产的数据,为什么呢?
因为kafka的消费者默认是消费最新生产的数据,如果想消费之前生产的数据需要添加一个参数–from-beginning,表示从头消费的意思

[root@bigdata01 kafka_2.12-2.4.1]# bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic hello --from-beginning
hehe

三、案例:QQ群聊天

通过kafka可以模拟QQ群聊天的功能,我们来看一下
首先在kafka中创建一个新的topic,可以认为是我们在QQ里面创建了一个群,群号是88888888

[root@bigdata01 kafka_2.12-2.4.1]# bin/kafka-topics.sh --create --zookeeper localhost:2181  --partitions 5 --replication-factor 2 --topic 88888888
Created topic 88888888.

然后我把你们都拉到这个群里面,这样我在群里面发消息你们就都能收到了
在bigdata02和bigdata03上开启消费者,可以认为是把这两个人拉到群里面了

[root@bigdata02 kafka_2.12-2.4.1]# bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic 88888888

[root@bigdata03 kafka_2.12-2.4.1]# bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic 88888888

然后我在bigdata01上开启生产者发消息,这样bigdata02和bigdata03都是可以收到的。

这样就可以认为在群里的人都能收到我发的消息,类似于发广播。

这个其实主要利用了kafka中的多消费者的特性,每个消费者都可以消费到相同的数据。

[root@bigdata01 kafka_2.12-2.4.1]# bin/kafka-console-producer.sh --broker-list localhost:9092 --topic 88888888
>hello everyone
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是基于Java的Kafka生产者消费者案例: **Kafka生产者案例:** ```java import java.util.Properties; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.ProducerRecord; public class KafkaProducerExample { public static void main(String[] args) throws Exception { String topicName = "test-topic"; String key = "test-key"; String value = "test-value"; Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); Producer<String, String> producer = new KafkaProducer<>(props); ProducerRecord<String, String> record = new ProducerRecord<>(topicName, key, value); producer.send(record); producer.close(); } } ``` **Kafka消费者案例:** ```java import java.util.Collections; import java.util.Properties; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.consumer.KafkaConsumer; import org.apache.kafka.common.serialization.StringDeserializer; public class KafkaConsumerExample { public static void main(String[] args) throws Exception { String topicName = "test-topic"; String groupId = "test-group"; Properties props = new Properties(); props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId); props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); Consumer<String, String> consumer = new KafkaConsumer<>(props); consumer.subscribe(Collections.singletonList(topicName)); while (true) { ConsumerRecords<String, String> records = consumer.poll(100); for (ConsumerRecord<String, String> record : records) { System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value()); } } } } ``` 以上案例生产者将一条消息发送到名为“test-topic”的主题消费者订阅该主题并消费消息。请注意,这只是基本示例,您可以根据需要进行更改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做一个有趣的人Zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值