4. Kafka 命令行工具:Topic 创建、消息生产与消费、偏移量查看
Kafka 发行版内置了一套功能完备的命令行工具,位于 $KAFKA_HOME/bin/ 目录下。这些工具是开发阶段验证集群连通性、调试消息格式、排查消费滞后最直接的手段。本章聚焦四个核心操作:创建 Topic、生产消息、消费消息 以及 查看偏移量,并给出高频参数对照与常见避坑指南。
前置条件:确保 Kafka 服务已启动(包括 ZooKeeper / KRaft 仲裁),且当前终端已配置
KAFKA_HOME 环境变量,或直接进入 $KAFKA_HOME/bin/ 目录执行命令。
4.1 创建 Topic
使用 kafka-topics.sh 脚本创建 Topic。以下命令创建一个名为 order-events、分区数为 3、副本因子为 2 的 Topic:
# 创建 Topic(ZooKeeper 模式)
bin/kafka-topics.sh --create \
--bootstrap-server localhost:9092 \
--replication-factor 2 \
--partitions 3 \
--topic order-events
# 创建 Topic(KRaft 模式,参数一致)
bin/kafka-topics.sh --create \
--bootstrap-server localhost:9092 \
--replication-factor 2 \
--partitions 3 \
--topic order-events
创建成功后,终端会输出 Created topic order-events.。常用参数说明如下:
| 参数 | 含义 | 推荐值 / 说明 |
|---|---|---|
--bootstrap-server |
Kafka 集群地址 | 格式 host:port,多个用逗号分隔 |
--partitions |
分区数 | 决定并行度,建议为消费者组内实例数的整数倍 |
--replication-factor |
副本因子 | 生产环境 ≥ 2,单节点测试可用 1 |
--config |
覆盖 Topic 级别配置 | 如 --config retention.ms=86400000 |
避坑:副本因子不能超过集群中可用的 Broker 数量。若只有 1 台 Broker,
--replication-factor 2 会报错 Replication factor: 2 larger than available brokers: 1。
4.2 生产消息
使用 kafka-console-producer.sh 从标准输入发送消息。默认以 Enter 键分隔消息,每行视为一条记录。
# 启动生产者,发送到 order-events Topic
bin/kafka-console-producer.sh \
--bootstrap-server localhost:9092 \
--topic order-events
# 输入消息内容(每行一条)
> order-1001:paid
> order-1002:shipped
> order-1003:delivered
如需指定 Key 或使用自定义分区器,可附加参数:
| 参数 | 作用 | 示例 |
|---|---|---|
--property parse.key=true |
启用 Key 解析 | 输入格式 key:value |
--property key.separator=: |
指定 Key 分隔符 | 默认 Tab,可改为 : |
--producer-property |
传递生产者配置 | --producer-property acks=all |
# 带 Key 的生产示例
bin/kafka-console-producer.sh \
--bootstrap-server localhost:9092 \
--topic order-events \
--property parse.key=true \
--property key.separator=:
# 输入:key:value
> 1001:{"orderId":"1001","status":"paid"}
4.3 消费消息
使用 kafka-console-consumer.sh 从指定 Topic 拉取消息。默认从最新偏移量开始消费,仅显示新到达的消息。
# 启动消费者,实时消费 order-events
bin/kafka-console-consumer.sh \
--bootstrap-server localhost:9092 \
--topic order-events \
--from-beginning
--from-beginning 参数使消费者从 Topic 最早可用偏移量开始读取,适合验证历史数据。常用消费参数:
| 参数 | 说明 |
|---|---|
--group |
指定消费者组 ID,用于偏移量管理与再均衡 |
--property print.key=true |
在输出中显示消息 Key |
--property print.partition=true |
显示消息所在分区号 |
--property print.offset=true |
显示消息偏移量 |
--max-messages |
消费指定条数后自动退出 |
# 带分组、打印 Key/分区/偏移量的消费命令
bin/kafka-console-consumer.sh \
--bootstrap-server localhost:9092 \
--topic order-events \
--group order-group-v1 \
--property print.key=true \
--property print.partition=true \
--property print.offset=true \
--from-beginning
4.4 查看偏移量
偏移量(Offset)是消费者在分区内的读取位置。使用 kafka-consumer-groups.sh 查看消费者组的偏移量状态与滞后(Lag)。
# 列出所有消费者组
bin/kafka-consumer-groups.sh \
--bootstrap-server localhost:9092 \
--list
# 查看指定组的偏移量详情
bin/kafka-consumer-groups.sh \
--bootstrap-server localhost:9092 \
--group order-group-v1 \
--describe
--describe 输出包含以下关键列:
| 列名 | 含义 | 诊断价值 |
|---|---|---|
TOPIC |
Topic 名称 | — |
PARTITION |
分区编号 | — |
CURRENT-OFFSET |
消费者当前已提交的偏移量 | 表示已消费到的位置 |
LOG-END-OFFSET |
分区最新消息的偏移量 | 表示生产者写入的最新位置 |
LAG |
滞后量 = LOG-END-OFFSET − CURRENT-OFFSET | 大于 0 表示消费速度跟不上生产速度 |
CONSUMER-ID |
消费者实例的唯一标识 | 用于定位具体消费者进程 |
偏移量重置:当需要重新消费历史数据或修复消费逻辑时,可使用
--reset-offsets 子命令将偏移量调整到指定位置。例如重置到最早偏移量:bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group order-group-v1 --topic order-events --reset-offsets --to-earliest --execute
4.5 核心操作流程总览
下图展示了从 Topic 创建到偏移量查看的完整命令行操作链路,以及各工具之间的数据流向关系:
4.6 常见问题与排查
- Topic 已存在错误:重复创建同名 Topic 会提示
Topic 'xxx' already exists.,可使用--list确认现有 Topic 列表。 - 消费者无消息输出:检查是否遗漏
--from-beginning;确认生产者是否已成功发送消息;使用--describe查看消费者组偏移量是否等于 LOG-END-OFFSET。 - 偏移量重置不生效:确保消费者组处于
inactive状态(所有消费者实例已停止),否则重置操作会被拒绝。 - 连接超时:验证
--bootstrap-server地址与端口是否正确,防火墙是否放行 9092 端口。
效率技巧:将常用命令写入 Shell 脚本或 Makefile,避免每次重复输入长参数。例如:
alias ktopic='kafka-topics.sh --bootstrap-server localhost:9092'