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

Posted

技术标签:

【中文标题】Kafka:无法启动 Kafka - 进程无法访问文件 00000000000000000000.timeindex【英文标题】:Kafka: unable to start Kafka - process can not access file 00000000000000000000.timeindex 【发布时间】:2018-01-17 20:54:55 【问题描述】:

卡夫卡爱好者,在这里需要一点帮助。我无法启动 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)

【问题讨论】:

参考替代解决方案:***.com/a/65070491/8888314 【参考方案1】:

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

您将丢失数据,并且偏移量将从 0 开始。

【讨论】:

没有松散数据还有其他解决方案吗? 一旦我收到此错误,现在尝试删除日志 3 次,但仍然面临同样的问题 :( 我遇到了同样的错误。为什么我们每次都想删除日志数据?有永久的解决方案吗? 这个问题经常发生在我身上。每天删除所有内容并重新开始,这真的很烦人。任何不涉及截断所有内容的解决方案? 像 Melwyn 一样,我这样做了很多次,但仍然遇到同样的错误。【参考方案2】:

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

有两种解决方法:

    按照这里其他人的建议,您可以清理包含日志文件的目录(或进行备份并将 log.dirs 指向另一个目录)。但是,通过这种方式您将丢失您的数据。 转到您的 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 进行处理 看起来它可能很快就会解决。

【讨论】:

我认为这是最好的答案,因为它解决了根本原因。变通办法只是推迟了不可避免的事情。该问题仍未得到解决,并且看起来不会在正式发布后立即解决,Windows 不是受支持的操作系统。那里有一些补丁,包括Microsoft fork,但我没有尝试过,所以无法评论。替代方案可能是在 Windows 上尝试 Linux 容器。【参考方案3】:

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

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

你只是按顺序运行了这两个命令

kafka-server-stop.sh

zookeeper-server-stop.sh

那么下次启动时,你会发现没有问题。

【讨论】:

我停止了 kafka-server-stop.sh 和 zkServer.sh,然后使用 zkServer.sh start 和 kafka-server-start.sh 重新启动它,它对我有用。 没有用。事实上,第一个命令没有任何作用,因为 Kafka 服务器已经崩溃了。 @swdonthis 是为了在崩溃发生之前预防,而不是解决它。 为什么会有这种态度?对我来说,这是在 Windows 上运行 kafka 的错误。与没有正确关闭kafka无关。 @TonySchwartz 当您终止进程而不是正确关闭时,这对所有事情都是一个问题。用你的态度来拔掉你的电脑,而不是正常关机,祝你好运。【参考方案4】:
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.

00000000000000000000.timeindex 正被另一个进程使用。因此,您可以使用以下命令删除该进程

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

这里的PID是zookeeper的进程ID。


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

ephemeral972 给出的temporary solution 有两种方式:

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

【讨论】:

【参考方案5】:

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

请按以下步骤操作:

    进入kafka安装的config文件夹。 打开 Server.properties 文件 你会看到配置

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

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

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

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

这应该可以解决问题。

【讨论】:

在再次停止 kafka-server 并尝试重新启动它之后?将 log.dirs 更改为 /tmp/log/kafka2? ;-) 我在 Windows 10 上遇到了同样的错误。如果每次更改日志目录,数据都会丢失。有永久的解决方案吗?【参考方案6】:

我遇到了同样的问题,重新启动 kafka 和 zook,然后 windows 对我不起作用。 什么对我有用(不要在生产模式下复制它,我不确定它是否能正常工作,但它可以通过开发 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文件,一切正常。

【讨论】:

这种方法对我有用,但不确定我们是否会用这种方法丢失任何数据?【参考方案7】:

遵循@SkyWalker建议的方法

按照以下步骤操作:

    列出项目。打开 zkCli 并获取代理中的所有内容。请参阅下面的屏幕截图。

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

    然后删除每个主题。

【讨论】:

【参考方案8】:

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

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

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

【讨论】:

使用格式化工具使您的帖子更具可读性。代码块应类似于 code block。如果需要,请使用 bold italics,并且应该将图像添加为图像,而不是链接。【参考方案9】:

我在 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提出的解决方案达斯可能会奏效。我在 Windows 上启动 zkCli 时遇到了问题,而且我只有那些在我的代理上删除的主题,所以我可以安全地执行上述步骤并摆脱它。

【讨论】:

我只需要停止 Kafka 和 Zookeeper,转到临时文件夹并强制删除 kafka-logs 和 zookeeper 文件夹。这意味着你失去了一切,但你将能够再次启动 kafka(在 zookeeper 之后)!【参考方案10】:

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

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

然后我将反斜杠“\”改为“/”:

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

并创建文件夹来解决问题

【讨论】:

【参考方案11】:

对我来说,重命名日志文件后它起作用了 log.dirs=D:/kafka_2.13-2.4.0/data/kafka 到 kafka1。

还修改了 log.retention.hours=1 ,避免问题重复

【讨论】:

【参考方案12】:

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

查找日志存储位置。

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

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

log.dirs=/这个位置/

【讨论】:

【参考方案13】:

这是针对窗户的:

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

netstat -aon | findstr 'yourPortNumberHere' 

taskkill /pid <pid here> f

为两个端口运行上述命令。

【讨论】:

以上是关于Kafka:无法启动 Kafka - 进程无法访问文件 00000000000000000000.timeindex的主要内容,如果未能解决你的问题,请参考以下文章

kafka报错:timeindex :另一个程序正在使用此文件,进程无法访问

kafka报错:timeindex :另一个程序正在使用此文件,进程无法访问

kafka报错:timeindex :另一个程序正在使用此文件,进程无法访问

启动zookeeper和kafka时 kafka无法启动或者闪退

一旦在 Kubernetes/Minikube 中,Kafka 就无法访问

启动zookeeper和kafka时kafka报错或闪退一直无法启动