You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Kafka启动失败:日志文件被其他进程占用(Windows环境)

解决Windows环境下Kafka日志删除时的文件占用错误

我之前在Windows本地部署Kafka做开发测试时,也碰到过一模一样的问题!虽然Process Explorer查下来只有Kafka的Java进程在访问目标文件,但Windows的文件系统锁定机制确实容易搞出这种“诡异”的状况。下面是我亲测有效的解决思路,按优先级尝试:

1. 手动清理待删除日志文件(最快见效)

首先完全停止Kafka和ZooKeeper服务

  • 直接关闭它们的运行窗口,或者用命令行强制终止所有Java进程(如果没有其他Java程序在运行的话):
    taskkill /f /im java.exe
    

然后进入日志目录C:\tools\kafka_2.12-1.1.0\kafka-logs\my-replicated-topic-0

  • 删除所有带.deleted后缀的文件;
  • 确认00000000000000000000.log没有被其他进程占用(再用Process Explorer扫一遍),如果没问题,直接删掉这个旧日志——它本来就因为超过保留时间要被清理了。

重启Kafka和ZooKeeper,大概率就能正常启动了。

2. 调整Kafka日志清理配置(减少触发频率)

Windows的文件系统对文件重命名、删除的锁定规则比Linux严格,你可以修改server.properties来降低清理触发的频率:

  • 延长日志保留时间:把log.retention.hours从默认的168(7天)改成更大的值,比如:
    log.retention.hours=336
    
  • 调整清理检查间隔:把默认10分钟的检查间隔拉长:
    log.cleanup.interval.mins=30
    
  • 测试环境临时关闭清理:如果只是做测试,暂时不需要日志清理,可以改清理策略为压缩(或者直接注释相关配置,不推荐长期用,避免日志爆仓):
    log.cleanup.policy=compact
    

修改完配置记得重启Kafka。

3. 排查系统级的隐形锁定

有时候Windows的后台服务会悄悄锁定文件,Process Explorer可能查不到:

  • 临时关闭Windows Defender或其他杀毒软件的实时保护,再启动Kafka试试;
  • 暂停Windows搜索服务(WSearch),它可能在索引Kafka日志目录;
  • 检查OneDrive、Windows备份等同步工具,看看是不是正在同步日志文件夹,暂时关掉同步。

4. 升级Kafka版本(彻底解决兼容性问题)

你用的是Kafka 2.12-1.1.0,这个版本比较旧,早期Kafka在Windows上的文件处理确实有不少兼容性bug。如果上面的方法都治标不治本,建议升级到2.8.x或3.x的稳定版本,新版本对Windows文件系统的支持好了很多,这类锁定问题基本都修复了。


你遇到的错误日志回顾

java.nio.file.FileSystemException: C:\tools\kafka_2.12-1.1.0\kafka-logs\my-replicated-topic-0\00000000000000000000.log -> C:\tools\kafka_2.12-1.1.0\kafka-logs\my-replicated-topic-0\00000000000000000000.log.deleted: The process cannot access the file because it is being used by another process.

对应的Kafka运行日志片段:

[2018-05-14 11:25:35,965] INFO [GroupMetadataManager brokerId=0] Finished loading offsets and group metadata from __consumer_offsets-48 in 0 milliseconds. (kafka.coordinator.group.GroupMetadataManager)
[2018-05-14 11:26:04,864] INFO [Log partition=my-replicated-topic-0, dir=C:\tools\kafka_2.12-1.1.0\kafka-logs] Found deletable segments with base offsets [0] due to retention time 604800000ms breach (kafka.log.Log)
[2018-05-14 11:26:04,869] INFO [Log partition=my-replicated-topic-0, dir=C:\tools\kafka_2.12-1.1.0\kafka-logs] Scheduling log segment [baseOffset 0, size 150] for deletion. (kafka.log.Log)
[2018-05-14 11:26:04,882] ERROR Error while deleting segments for my-replicated-topic-0 in dir C:\tools\kafka_2.12-1.1.0\kafka-logs (kafka.server.LogDirFailureChannel)
java.nio.file.FileSystemException: C:\tools\kafka_2.12-1.1.0\kafka-logs\my-replicated-topic-0\00000000000000000000.log -> C:\tools\kafka_2.12-1.1.0\kafka-logs\my-replicated-topic-0\00000000000000000000.log.deleted: The process cannot access the file because it is being used by another process.

内容的提问来源于stack exchange,提问作者ca9163d9

火山引擎 最新活动