Kafka:无法启动 Kafka - 进程无法访问文件 00000000000000000000.timeindex

Kafka: unable to start Kafka - process can not access file 00000000000000000000.timeindex

卡夫卡爱好者,在这里需要很少的帮助。我无法启动 kafka,因为文件 [=12=]000000000000000000.timeindex 正在被另一个进程使用。以下是日志:

[2017-08-09 22:49:22,811] FATAL [Kafka Server 0], Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
java.nio.file.FileSystemException: \installation\kafka_2.11-0.11.0.0\log\test-0[=11=]000000000000000000.timeindex: The process cannot access the file because it is being used by another process.

        at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86)
        at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
        at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
        at sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:269)
        at sun.nio.fs.AbstractFileSystemProvider.deleteIfExists(AbstractFileSystemProvider.java:108)
        at java.nio.file.Files.deleteIfExists(Files.java:1165)
        at kafka.log.Log$$anonfun$loadSegmentFiles.apply(Log.scala:311)
        at kafka.log.Log$$anonfun$loadSegmentFiles.apply(Log.scala:272)
        at scala.collection.TraversableLike$WithFilter$$anonfun$foreach.apply(TraversableLike.scala:733)
        at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
        at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
        at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:732)
        at kafka.log.Log.loadSegmentFiles(Log.scala:272)
        at kafka.log.Log.loadSegments(Log.scala:376)
        at kafka.log.Log.<init>(Log.scala:179)
        at kafka.log.Log$.apply(Log.scala:1580)
        at kafka.log.LogManager$$anonfun$loadLogs$$anonfun$$anonfun$apply$$anonfun$apply.apply$mcV$sp(LogManager.scala:172)
        at kafka.utils.CoreUtils$$anon.run(CoreUtils.scala:57)
        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)
[2017-08-09 22:49:22,826] INFO [Kafka Server 0], shutting down (kafka.server.KafkaServer)

我遇到了同样的问题。我唯一能弄清楚的方法就是删除 C:\tmp\kafka-logs 目录。之后我就可以启动kafka服务器了。

您将丢失数据,偏移将从 0.

开始
java.nio.file.FileSystemException: \installation\kafka_2.11-0.11.0.0\log\test-0[=10=]000000000000000000.timeindex: The process cannot access the file because it is being used by another process.

00000000000000000000.timeindex 正在被另一个进程使用。所以你可以使用以下命令删除进程

$ ps aux | grep zookeeper
$ sudo kill -9 <PID> 

这里的PID是zookeeper的进程号


问题还没有解决。此处描述:https://issues.apache.org/jira/browse/KAFKA-1194

ephemeral972 给出了 temporary solution 的 2 种方法:

  1. [推荐] 您需要清理 zookeeper 路径 /brokers/ids/[] 中的代理 ID。使用 zk-cli tool delete 命令清理路径。启动您的代理并验证它向协调器注册。
  2. 解决此问题的另一种方法是从 kafka 服务器配置更改您的代理 ID 并重新启动代理。但是,这会损坏您的分区和数据,不推荐使用

遵循@SkyWalker

建议的方法

按照以下步骤操作:

  1. 列出 item.Open zkCli 并获取代理中的所有内容。请参阅下面的屏幕截图。

  2. 进入主题并按双标签。您将获得此处列出的所有主题。

  3. 然后删除每个主题。

我在 windows 上 运行 kafka 时也遇到了这个错误。 您可以通过更改 sever.properties 文件中的默认配置来避免此错误。

请按照以下步骤操作:

  1. 进入kafka安装的config文件夹
  2. 打开 Server.properties 文件
  3. 您将看到配置

用于存储日志文件的目录的逗号分隔列表:

log.dirs=/tmp/logs/kafka**

log.dirs=/tmp/logs/kafka 的值更改为其他值,例如:

log.dirs=/tmp/logs/kafka1
  1. 现在再次启动您的 kafka-server。

这应该可以解决问题。

我遇到了同样的问题,我就是这样解决的。

更改 log.dirs 中的路径 server.properties log.dirs=C:\kafka\logs

另一种有效的解决方案: 从以下目录中删除配置的所有文件 kafkalogs\test-0

我在 windows 上遇到了类似的问题,部分原因是我删除了几个主题(因为我没有找到其他方法来仅刷新来自这些主题的消息)。 这对我有用。

Change the logs.dir in config/server.properties to new location
Change the dataDir in config/zookeeper.properties to new location
Restart zookeeper and kafka

当您除了在 zookeeper/kafka 上删除的内容之外没有其他主题时,上面的内容显然会起作用,如果您仍然想保留其他主题的配置,我相信解决方案@Sumit Das 提出的建议可能有效。我在我的 windows 上启动 zkCli 时遇到问题,我只有那些我在代理上删除的主题,所以我可以安全地执行上述步骤并摆脱它。

所有答案都通过删除数据为您提供相同的解决方案,而不是如何预防问题。

实际上,您只需要正确停止 Kafka 和 Zookeepter 即可。

你只需要运行这两个命令

kafka-server-stop.sh

zookeeper-server-stop.sh

那么下次启动就不会出现问题了

我遇到了同样的问题,然后重新启动 kafka 和 zook windows 对我不起作用。 什么对我有用(不要在生产模式下重现它,我不确定它是否可以正常工作,但它可以被 DEVELOPMENT kafka 服务器接受。

在 dev kafka 服务器上: 转到相关目录(例如 \installation\kafka_2.11-0.11.0.0\log\test-0) 并删除除 :

以外的所有文件
00000000000000000000.index
00000000000000000000.log
00000000000000000000.timeindex
leader-epoch-checkpoint

然后重启kafka,对我来说没问题,重启后(zookeeper然后kafka),kafka添加一个.snapshot文件,一切正常。

这似乎是一个已知问题,在您上次发布消息 168 小时后 Windows 上会触发该问题。 显然这个问题正在这里被跟踪和处理:KAFKA-8145

有两种解决方法:

  1. 正如这里其他人所建议的那样,您可以清理包含日志文件的目录(或者备份并让 log.dirs 指向另一个目录)。然而,通过这种方式你会丢失你的数据
  2. 转到您的 server.properties 文件并对其进行以下更改。注意:这是临时解决方案,可让您的消费者启动并使用任何剩余数据,以免数据丢失。获得所需的所有数据后,您应该返回到第 1 步,一劳永逸地清理您的数据文件夹。

将属性以下更新为规定值

# The minimum age of a log file to be eligible for deletion due to age
log.retention.hours=-1

将此 属性 添加到属性文件的末尾。

log.cleaner.enable=false

本质上,您正在做的是告诉 Kafka 代理不要费心删除旧消息,并且所有消息的年龄现在都是无限的,即它们永远不会被删除。如您所见,这显然不是理想的状态,因此您应该只执行此操作,以便您能够使用所需的任何内容,然后清理文件/目录(第 1 步)。 恕我直言,上面提到的 JIRA 问题很快就会按照 this comment 进行处理 看来很快就能解决了。

我将 tmp 路径配置如下:(在文件 ./config/server.properties 中)

log.dirs=d:\tmp\kafka-logs

然后我从反斜杠'\'改为'/':

log.dirs=d:/tmp/kafka-logs

并创建文件夹解决问题

对我来说,它在重命名日志文件后有效 log.dirs=D:/kafka_2.13-2.4.0/data/kafka到kafka1.

同时修改了log.retention.hours=1,避免重复issue

解决方案:在 Windows 中手动删除日志。并重启 kafka-server 或 broker

正在查找日志存储位置。

转到server.properties #############################日志基础################### ##########

用于存储日志文件的目录的逗号分隔列表

log.dirs=/这个位置/

这是给windows的:

在 powershell 中使用以下命令终止端口“9092”和“2181”上的进程 运行。

netstat -aon | findstr 'yourPortNumberHere' 

taskkill /pid <pid here> f

运行 以上两个端口的命令。