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

a_a*_*a_a 21 windows access-denied apache-kafka

卡夫卡爱好者,在这里需要一些帮助.我无法启动kafka,因为该文件\00000000000000000000.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\00000000000000000000.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$3.apply(Log.scala:311)
        at kafka.log.Log$$anonfun$loadSegmentFiles$3.apply(Log.scala:272)
        at scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.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$2$$anonfun$5$$anonfun$apply$12$$anonfun$apply$1.apply$mcV$sp(LogManager.scala:172)
        at kafka.utils.CoreUtils$$anon$1.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)
Run Code Online (Sandbox Code Playgroud)

pat*_*elb 35

我遇到过同样的问题.我能搞清楚的唯一方法就是删除C:\tmp\kafka-logs 目录.之后,我能够启动kafka服务器.

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

  • 有没有其他解决方案没有松散的数据? (6认同)
  • 遇到此错误后,现在尝试将日志删除3次,但仍然面临相同的问题:( (2认同)
  • 这个问题不断发生在我身上.删除所有内容并每天重新开始是非常烦人的.任何不涉及截断一切的解决方案? (2认同)

小智 13

这似乎是一个已知问题,在您上次发布消息后 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
Run Code Online (Sandbox Code Playgroud)

在属性文件的末尾添加此属性。

log.cleaner.enable=false
Run Code Online (Sandbox Code Playgroud)

本质上,您正在做的是告诉 Kafka 代理不要打扰删除旧消息,并且所有消息的年龄现在是无限的,即它们永远不会被删除。正如您所看到的,这显然不是一个理想的状态,因此您应该这样做,以便您能够使用所需的任何内容,然后清理您的文件/目录(步骤 1)。恕我直言,上面提到的 JIRA 问题 很快就会得到解决,根据此评论,它似乎很快就会得到解决。

  • 我认为这是最好的答案,因为它解决了根本原因。这些变通办法只是推迟了不可避免的事情的发生。该问题仍然没有得到解决,并且看起来不会很快正式解决,Windows 不是受支持的操作系统。有一些补丁,包括 [Microsoft fork](https://github.com/microsoft/kafka),但我还没有尝试过,所以无法发表评论。另一种选择可能是在 Windows 上尝试 Linux 容器。 (2认同)

Sur*_*oen 7

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

实际上,您只需要正确停止 Kafka 和 Zookeeper。

您只需按顺序运行这两个命令

kafka-server-stop.sh

zookeeper-server-stop.sh
Run Code Online (Sandbox Code Playgroud)

然后下次开始时,您将看不到任何问题。

  • 为什么态度?对我来说,这是在 Windows 上运行 kafka 的一个错误。与没有正确关闭 kafka 无关。 (3认同)
  • 不工作。事实上,第一个命令没有任何作用,因为 Kafka 服务器已经崩溃了。 (2认同)