Kafka基础-安装、基础命令等

📢 此文档中的命令是基于mac 或者linux ,windows下需要把bin/xxx.sh替换成bin/windows/xxxx.bat

一、下载

kafka.apache.org/downloads

二、启动

1.启动zookeeper

进入安装路径后,在路径栏输入cmd

bash 复制代码
./bin/zookeeper-server-start.sh ./config/zookeeper.properties

2.启动kafka

再次进入安装路径后,在路径栏输入cmd,新开一个cmd窗口

bash 复制代码
./bin/kafka-server-start.sh ./config/server.properties

注意:以上两个窗口不要关闭

三、测试

1.创建主题XXX

css 复制代码
./bin/kafka-topics.sh --create --bootstrap-server 127.0.0.1:9092 --replication-factor 1 --partitions 1 --topic XXX

低版本的使用--zookeeper 高版本使用--bootstrap-server

端口号要也要根据版本,填写zookeeper(2181)或者kafka的端口号(9092)

2.查看主题

css 复制代码
./bin/kafka-topics.sh --list --bootstrap-server 127.0.0.1:9092

低版本的使用--zookeeper 高版本使用--bootstrap-server

端口号要也要根据版本,填写zookeeper(2181)或者kafka的端口号(9092)

3.修改主题

bash 复制代码
# 修改主题topic1的分区为3个
./bin/kafka-topics.sh --bootstrap-server 127.0.0.1:9092 --alter  --topic topic1 --partitions 3

低版本的使用--zookeeper 高版本使用--bootstrap-server

端口号要也要根据版本,填写zookeeper(2181)或者kafka的端口号(9092)

4.创建生产者

进入安装路径,打开一个新的cmd窗口

bash 复制代码
./bin/kafka-console-producer.sh --broker-list 127.0.0.1:9092 --topic topic1

5.创建消费者

进入安装路径,打开一个新的cmd窗口

javascript 复制代码
./bin/kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic XXX --from-beginning

低版本的使用--zookeeper 高版本使用--bootstrap-server

端口号要也要根据版本,填写zookeeper(2181)或者kafka的端口号(9092)

四、代码实现消费者

java 复制代码
package test;

import java.time.Duration;
import java.util.Arrays;
import java.util.Properties;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;

public class KafkaConsumer {

	public static void main(String[] args) {
		String servers = "127.0.0.1:9092";
		String groupId = "test-consumer-group"; // 消费组名称
		String[] topic = new String[] { "topic1" }; // 主题名称

		Properties props = new Properties();
		props.put("bootstrap.servers", servers);
		props.put("group.id", groupId); // 消费组id
		props.put("enable.auto.commit", "true"); // 设置自动提交偏移量,在每次poll的时候,会提交上一次处理的消息的偏移量
		props.put("auto.commit.interval.ms", "1000"); // 自动提交偏移量的时间间隔
		props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
		props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
		props.put("auto.offset.reset", "earliest"); // 偏移量重置的规则,earliest:使用最早的消息的偏移量;latest:使用最新消息的偏移量

        // 创建消费者
		org.apache.kafka.clients.consumer.KafkaConsumer<String, String> consumer = new org.apache.kafka.clients.consumer.KafkaConsumer<String, String>(props);
		// 订阅主题消息
        consumer.subscribe(Arrays.asList(topic));
		try {
			while (true) {
				// 拉取消息
				ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000));
				for (ConsumerRecord<String, String> record : records) {
					System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
					System.out.println("");
                    // TODO 在此处理一些业务逻辑
                    // doSomeThing();
				}
			}
		} finally {
			consumer.close();
		}
	}
}

消费者详解参考文档:

blog.csdn.net/mxk4869/art...

遇到的问题,及解决方案

1.LEADER_NOT_AVAILABLE

dart 复制代码
2023-01-16|17:19:25.649|emap-pool-1-thread-8|WARN  ==> [Consumer clientId=consumer-1, groupId=yjscom] Error while fetching metadata with correlation id 668 : {ClassRoom=LEADER_NOT_AVAILABLE} (NetworkClient.java:882)
2023-01-16|17:19:25.752|emap-pool-1-thread-8|WARN  ==> [Consumer clientId=consumer-1, groupId=yjscom] Error while fetching metadata with correlation id 670 : {ClassRoom=LEADER_NOT_AVAILABLE} (NetworkClient.java:882)
2023-01-16|17:19:25.857|emap-pool-1-thread-8|WARN  ==> [Consumer clientId=consumer-1, groupId=yjscom] Error while fetching metadata with correlation id 672 : {ClassRoom=LEADER_NOT_AVAILABLE} (NetworkClient.java:882)
2023-01-16|17:19:25.962|emap-pool-1-thread-8|WARN  ==> [Consumer clientId=consumer-1, groupId=yjscom] Error while fetching metadata with correlation id 674 : {ClassRoom=LEADER_NOT_AVAILABLE} (NetworkClient.java:882)
2023-01-16|17:19:26.067|emap-pool-1-thread-8|WARN  ==> [Consumer clientId=consumer-1, groupId=yjscom] Error while fetching metadata with correlation id 676 : {ClassRoom=LEADER_NOT_AVAILABLE} (NetworkClient.java:882)
2023-01-16|17:19:26.172|emap-pool-1-thread-8|WARN  ==> [Consumer clientId=consumer-1, groupId=yjscom] Error while fetching metadata with correlation id 678 : {ClassRoom=LEADER_NOT_AVAILABLE} (NetworkClient.java:882)
2023-01-16|17:19:26.278|emap-pool-1-thread-8|WARN  ==> [Consumer clientId=consumer-1, groupId=yjscom] Error while fetching metadata with correlation id 680 : {ClassRoom=LEADER_NOT_AVAILABLE} (NetworkClient.java:882)
2023-01-16|17:19:26.382|emap-pool-1-thread-8|WARN  ==> [Consumer clientId=consumer-1, groupId=yjscom] Error while fetching metadata with correlation id 682 : {ClassRoom=LEADER_NOT_AVAILABLE} (NetworkClient.java:882)

尝试telnet 10.119.6.143 9092:可以通

则大概率是服务端的问题。可以尝试删除topic新建topic

2.首次部署offset的设置

首次最好设置成latest,下次再设置成earliest

首次部署的时候,使用latest是因为,kafka中原来已经存在了很多的消息了,由于是第一次部署,就不用再把之前所有的消息都拿过来消费一遍。

后面如果停机更新的时候,需要改成earliest是因为,系统中已经存在偏移数据。在停机的时候,可能会有新的消息发送过来,如果还是使用latest就会导致这些消息没有丢掉了。但是改成earliest则会从上次的偏移位置继续处理,减少出先丢消息的现象。

相关推荐
starzy19903 小时前
KafkaProducer 加载元数据:一条 MetadataRequest 的完整旅程
大数据·kafka
RobinXYuan9 小时前
【Kafka 源码手记】04 客户端如何找到 Broker
kafka·源码阅读
Linux实战笔记12 小时前
记一次消息队列选型对比线上排查:Kafka/RabbitMQ/Pulsar 技术选型
kafka·rabbitmq·高并发·pulsar·消息队列选型
Norris Huang13 小时前
Kafka Connect 与 Flink CDC 写入 Iceberg:Upsert 的代价,以及 S3 Tables 的真正价值
分布式·flink·kafka
张彦峰ZYF13 小时前
一条消息的丢与重:Kafka 与 RabbitMQ 可靠投递的确认、位点、死信与幂等全链路
后端·kafka·消息队列·rabbitmq·isr·解耦与削峰·丢失与重复
我不会起名字3222 天前
Kafka 分区数到底设几个:吞吐量、顺序性与 rebalance 代价的取舍
kafka·消息队列·调优·分区
starzy19902 天前
深度拆解 Kafka 源码:Producer 构造器装配了哪些核心组件
分布式·kafka
我不会起名字3222 天前
Go 写 Kafka 消费者:sarama 的 3 个坑与优雅退出写法
kafka·消息队列·go·sarama
RobinXYuan4 天前
【Kafka 源码手记】02 Kafka 的核心哲学:Everything Is A Log
kafka·源码阅读
Sayai4 天前
Kafka 2.8→3.9.1 跨大版本升级实战:ZooKeeper 同步升级、数据目录迁移与回滚预案全流程
大数据·运维·分布式·zookeeper·kafka