Ubuntu运行Kafka报错的通用排查与解决方法
Kafka和Zookeeper的日志是排查问题的核心依据。Ubuntu下Kafka日志默认位于/var/log/kafka/(如server.log),Zookeeper日志位于其logs目录(如zookeeper.out)。使用以下命令实时查看最新日志:
tail -f /var/log/kafka/server.log # Kafka日志 tail -f /path/to/zookeeper/logs/zookeeper.out # Zookeeper日志 通过日志中的异常堆栈(如NullPointerException、PortInUseException)可快速定位错误根源。
Kafka的关键配置文件server.properties和Zookeeper的zookeeper.properties需重点检查:
server.properties:确认broker.id(每个broker唯一,如broker.id=1)、log.dirs(日志存储目录,如log.dirs=/tmp/kafka-logs)、zookeeper.connect(Zookeeper连接串,如zookeeper.connect=localhost:2181)、listeners(监听地址,如listeners=PLAINTEXT://localhost:9092)、advertised.listeners(对外暴露地址,如advertised.listeners=PLAINTEXT://your_server_ip:9092)配置正确。zookeeper.properties:确认dataDir(数据目录,如dataDir=/tmp/zookeeper)存在且有写入权限。Kafka依赖Zookeeper集群,需确保Zookeeper服务正常运行:
systemctl status zookeeper # 查看Zookeeper状态 systemctl start zookeeper # 若未启动则启动 若Zookeeper启动失败,需先解决其日志中的错误(如数据目录权限问题、端口冲突)。
Kafka默认使用9092端口(客户端通信)、Zookeeper默认使用2181端口(集群协调)。使用以下命令检查端口占用:
sudo netstat -tulnp | grep 9092 # 检查Kafka端口 sudo netstat -tulnp | grep 2181 # 检查Zookeeper端口 若端口被占用,可修改配置文件中的端口(如将listeners改为PLAINTEXT://localhost:9093)或终止占用进程(如kill -9 <PID>)。
df -h命令查看磁盘使用情况,若剩余空间不足(如小于10%),需清理无用文件或扩容磁盘。/path/to/kafka/config)、数据目录(如/tmp/kafka-logs)、日志目录(如/var/log/kafka)有读写权限:sudo chown -R $USER:$USER /path/to/kafka # 将Kafka目录所有权赋予当前用户 sudo chmod -R 755 /tmp/kafka-logs # 开放数据目录权限 Kafka需要Java 11及以上版本(Kafka 3.x及以上要求)。检查Java版本:
java -version 若未安装或版本不符,使用以下命令安装OpenJDK 11:
sudo apt update sudo apt install openjdk-11-jdk 同时,确保JAVA_HOME环境变量正确设置(如export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64,添加到~/.bashrc中)。
若Kafka启动时报FileSystemException(如文件被占用)或CorruptLogException(日志损坏),需清理数据目录:
rm -rf /tmp/kafka-logs/* # 删除Kafka日志文件(默认路径) 注意:此操作会清除所有消息数据,仅用于测试环境或数据可丢失场景。生产环境需先备份数据。
若报NotLeaderForPartitionException(当前Broker不是分区Leader)或分区数据不一致,可使用Kafka工具重新分配分区:
# 1. 生成重分配计划(假设主题为test) kafka-reassign-partitions.sh --bootstrap-server localhost:9092 --topics-to-move-json-file topics-to-move.json --broker-list "1,2,3" --generate # 2. 执行重分配(根据生成的plan.json文件) kafka-reassign-partitions.sh --bootstrap-server localhost:9092 --reassignment-json-file plan.json --execute # 3. 验证重分配结果 kafka-reassign-partitions.sh --bootstrap-server localhost:9092 --reassignment-json-file plan.json --verify 其中topics-to-move.json格式示例:{"topics": [{"topic": "test"}], "version": 1}。
UnknownHostException:检查server.properties中的listeners和advertised.listeners配置,确保主机名/IP可解析(如listeners=PLAINTEXT://your_server_ip:9092)。Timed out waiting for a node assignment:创建Topic时超报错,需将server.properties中的delete.topic.enable设置为true(允许自动删除Topic),然后重新创建。若以上步骤无法解决问题,建议提供具体错误日志(如server.log中的异常片段),以便进一步针对性分析。