4. Kafka 命令行操作:创建 Topic、查看描述、生产消息、消费消息、重置 Offset

Kafka 发行版内置了一套功能完备的命令行工具,位于 $KAFKA_HOME/bin/ 目录下。本章将围绕 Topic 生命周期管理与消息收发验证两个核心场景,逐一演示最常用的五个操作:创建 Topic、查看 Topic 详情、生产消息、消费消息以及重置消费者 Offset。所有命令均基于 Kafka 3.x 版本,并假设 ZooKeeper 或 KRaft 集群已正常运行。

4.1 创建 Topic

使用 kafka-topics.sh 脚本创建 Topic。创建时必须指定 Topic 名称、分区数(--partitions)和副本因子(--replication-factor)。副本因子不能超过集群中可用的 Broker 数量。

关键参数说明:
  • --bootstrap-server:指定 Kafka 集群地址,格式 host:port。
  • --partitions:分区数量,决定 Topic 的并行处理能力。
  • --replication-factor:副本数量,控制数据冗余与高可用。
  • --config:可选,设置 Topic 级别的覆盖参数(如 retention.ms)。
# 创建名为 "score-events" 的 Topic,3 个分区,2 个副本
bin/kafka-topics.sh --bootstrap-server localhost:9092 \
  --create \
  --topic score-events \
  --partitions 3 \
  --replication-factor 2
生产建议:分区数建议设置为 Broker 数量的整数倍,以便均匀分布 Leader 副本。副本因子在非生产环境可设为 1,生产环境至少为 2。

4.2 查看 Topic 描述

创建完成后,使用 --describe 参数查看 Topic 的详细元数据,包括分区分配、Leader 副本、ISR(In-Sync Replicas)列表等关键信息。

# 查看 "score-events" 的详细信息
bin/kafka-topics.sh --bootstrap-server localhost:9092 \
  --describe \
  --topic score-events

输出示例及字段含义:

字段 示例值 说明
Topic score-events Topic 名称
Partition 0 分区编号
Leader 1 当前负责该分区读写请求的 Broker ID
Replicas 1,2 该分区的所有副本所在的 Broker 列表
Isr 1,2 与 Leader 保持同步的副本列表(In-Sync Replicas)
排障提示:如果 Isr 列表少于 Replicas 列表,说明有副本落后或宕机,需检查对应 Broker 的日志和网络状况。
Topic 创建与元数据描述流程 kafka-topics.sh Broker 控制器 元数据存储 --create / --describe 写入/读取元数据 返回分配结果 返回描述信息 关键流程说明: 1. 客户端发送 --create 请求,控制器分配分区与副本,写入元数据存储。 2. 客户端发送 --describe 请求,控制器从元数据存储读取分区分配、Leader、ISR 等信息。 3. 所有元数据变更都会记录在元数据日志中,保证集群状态一致性。

4.3 生产消息

使用 kafka-console-producer.sh 向 Topic 发送消息。默认情况下,每条消息以换行符分隔,键与值之间用制表符(Tab)分隔。生产环境建议显式指定序列化器和分区器。

# 启动生产者,向 "score-events" 发送消息
bin/kafka-console-producer.sh --bootstrap-server localhost:9092 \
  --topic score-events \
  --property "parse.key=true" \
  --property "key.separator=:"

输入示例(每行一条消息,键与值用 : 分隔):

user001:{"score": 95, "subject": "math"}
user002:{"score": 88, "subject": "english"}
user003:{"score": 92, "subject": "science"}
生产建议:使用 --property "parse.key=true" 可以指定消息键,Kafka 根据键的哈希值决定消息进入哪个分区,从而保证相同键的消息被路由到同一分区,维持局部顺序。

4.4 消费消息

使用 kafka-console-consumer.sh 消费消息。默认情况下,消费者从最新偏移量开始读取,只消费启动后到达的新消息。若要查看历史消息,需指定 --from-beginning。

# 启动消费者,从最早偏移量开始消费
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 \
  --topic score-events \
  --from-beginning \
  --property "print.key=true" \
  --property "key.separator=:"

输出示例:

user001:{"score": 95, "subject": "math"}
user002:{"score": 88, "subject": "english"}
user003:{"score": 92, "subject": "science"}
注意:如果消费者组(--group)已提交过偏移量,--from-beginning 不会生效,消费者会从上次提交的偏移量继续消费。要重新消费所有消息,需要先重置偏移量或使用新的消费者组。

4.5 重置 Offset

当需要重新处理历史数据或修复消费逻辑时,可以使用 kafka-consumer-groups.sh 重置消费者组的偏移量。重置操作支持多种策略:--to-earliest(最早)、--to-latest(最新)、--to-offset(指定偏移量)、--shift-by(相对偏移)等。

# 将消费者组 "score-group" 的所有分区偏移量重置到最早位置
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
  --group score-group \
  --topic score-events \
  --reset-offsets \
  --to-earliest \
  --execute

重置策略对比:

策略参数 说明 适用场景
--to-earliest 重置到分区的最早偏移量 重新处理全部历史数据
--to-latest 重置到分区的最新偏移量 跳过历史数据,只消费新消息
--to-offset 重置到指定的绝对偏移量 从特定位置开始消费
--shift-by 在当前偏移量基础上向前或向后移动 N 条 跳过或重复消费最近 N 条消息
--to-datetime 重置到指定时间戳对应的偏移量 按时间回溯消费
重置 Offset 的注意事项:
  • 重置前必须确保消费者组处于 非运行状态,否则操作会被拒绝。
  • 使用 --dry-run 参数可以预览重置结果而不实际执行,建议先预览再执行。
  • 重置操作只影响指定消费者组的偏移量,不会影响 Topic 中的消息数据。
消费者 Offset 重置流程 管理员 kafka-consumer-groups --reset-offsets Group 协调器 Broker __consumer_offsets 内部 Topic 执行命令 请求重置 写入新 Offset 确认写入 返回结果 重置 Offset 执行步骤: 1. 管理员通过 kafka-consumer-groups.sh 发送重置请求,指定策略(--to-earliest 等)。 2. Group 协调器验证消费者组状态(必须停止),计算目标偏移量。 3. 协调器将新的偏移量写入内部 Topic __consumer_offsets,完成重置。

4.6 常用命令速查表

操作 命令脚本 核心参数
创建 Topic kafka-topics.sh --create --topic --partitions --replication-factor
查看 Topic 列表 kafka-topics.sh --list
查看 Topic 详情 kafka-topics.sh --describe --topic
生产消息 kafka-console-producer.sh --topic --property "parse.key=true"
消费消息 kafka-console-consumer.sh --topic --group --from-beginning
重置 Offset kafka-consumer-groups.sh --group --reset-offsets --to-earliest --execute
学习路径提示:建议在本地搭建单节点 Kafka 环境,依次执行上述五个操作,观察每个命令的输出结果。理解 Topic 元数据、消息分区与 Offset 的关系,是后续学习 Kafka Streams 和实时评分计算的基础。