问题描述
Kafka 启动失败,错误如下:
Fatal error during KafkaServer startup. Prepare to shutdown
java.lang.IllegalArgumentException: Duplicate log directories found: /node5/kafka/data/logs-47,/node7/kafka/data/logs-47!
at kafka.log.LogManager$$anonfun$loadLogs$2$$anonfun$3$$anonfun$apply$10$$anonfun$apply$1.apply$mcV$sp(LogManager.scala:155)
at kafka.utils.CoreUtils$$anon$1.run(CoreUtils.scala:56)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Kafka 0.9.0.1 作为 Cloudera 的一部分进行部署。
这个问题是什么意思?
在某些主题分区中出现复制不足的分区问题后,我在重新启动代理后遇到此错误。
重启前代理的日志中有以下错误
java.lang.IllegalStateException: Compaction for partition [logs,47] cannot be aborted and paused since it is in LogCleaningPaused state.
at kafka.log.LogCleanerManager$$anonfun$abortAndPauseCleaning$1.apply$mcV$sp(LogCleanerManager.scala:149)
at kafka.log.LogCleanerManager$$anonfun$abortAndPauseCleaning$1.apply(LogCleanerManager.scala:140)
at kafka.log.LogCleanerManager$$anonfun$abortAndPauseCleaning$1.apply(LogCleanerManager.scala:140)
at kafka.utils.CoreUtils$.inLock(CoreUtils.scala:231)
...
Cloudera 数据目录配置:
/node/kafka/data
/node2/kafka/data
...
/node8/kafka/data
更新
我检查了重复的目录内容,发现最新的目录似乎有空的日志段:
ls -l /node5/kafka/data/logs-47
-rw-r--r-- 1 kafka kafka 10485760 Mar 9 05:35 00000000000000000000.index
-rw-r--r-- 1 kafka kafka 0 Mar 8 13:12 00000000000000000000.log
虽然旧文件夹不是:
ls /node7/kafka/data/logs-47
-rw-r--r-- 1 kafka kafka 10485760 Mar 9 05:35 00000000000000366115.index
-rw-r--r-- 1 kafka kafka 0 Nov 25 10:13 00000000000000366115.log
解决方法
您的错误是说您在单个代理上有多个目录,其中包含来自名为 logs
的主题的数据,该主题至少有 47 个分区。
LogCleaner 无法继续删除该数据,除非它知道哪个是正确的目录
如果您对主题中的内容有所了解,可以转储日志段并检查消息
如果你不知道应该有什么数据,并且分区被复制到其他健康的broker,那么删除所有有问题的分区目录并重新启动broker,让复制修复丢失的数据