无法删除版本2.3.1

时间:2019-11-19 08:18:24

标签: apache-kafka-streams

似乎kafka streaming : java.nio.file.DirectoryNotEmptyException中描述的问题在版本2.3.1中仍然存在。我们将应用程序升级到2.3.1,并生成了许多类似以下的日志。清理线程尝试删除的目录为空,并且只能由root用户手动删除。该应用程序在Docker容器中运行,/ tmp / kafka-streams目录映射到物理/ streams目录。
请指教。
谢谢马克

从应用程序登录:

  

2019-11-19 07:56:46,951   [StringAggregator-8ff4a4d6-5a4f-4bdf-a452-4b01f93a8956-CleanupThread]   错误org.apache.kafka.streams.processor.internals.StateDirectory-   流线程   [StringAggregator-8ff4a4d6-5a4f-4bdf-a452-4b01f93a8956-CleanupThread]   删除状态目录失败。   java.nio.file.DirectoryNotEmptyException:   / tmp / kafka-streams / StringAggregator / 0_27           在sun.nio.fs.UnixFileSystemProvider.implDelete(UnixFileSystemProvider.java:242)           在sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103)           在java.nio.file.Files.delete(Files.java:1126)           在org.apache.kafka.common.utils.Utils $ 2.postVisitDirectory(Utils.java:769)           在org.apache.kafka.common.utils.Utils $ 2.postVisitDirectory(Utils.java:752)           在java.nio.file.Files.walkFileTree(Files.java:2688)           在java.nio.file.Files.walkFileTree(Files.java:2742)           在org.apache.kafka.common.utils.Utils.delete(Utils.java:752)           在org.apache.kafka.streams.processor.internals.StateDirectory.cleanRemovedTasks(StateDirectory.java:301)           在org.apache.kafka.streams.processor.internals.StateDirectory.cleanRemovedTasks(StateDirectory.java:264)           在org.apache.kafka.streams.KafkaStreams.lambda $ start $ 1(KafkaStreams.java:802)           在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511)           在java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)           在java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 301(ScheduledThreadPoolExecutor.java:180)           在java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)           在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)           在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)           在java.lang.Thread.run(Thread.java:748)

1 个答案:

答案 0 :(得分:0)

这是Windows和NFS上状态目录的一个已知问题,并且已提交here错误。

此错误的影响是,Kafka Streams客户端无法通过其清理线程或显式调用KafkaStreams#cleanUp()来删除其使用的状态目录。基本上,客户端会创建只能通过手动删除目录来释放的目录。

尝试删除目录后应释放文件锁。这样目录就可以被Kafka Streams客户端重用。

从正确性的角度来看,这应该不是问题,因为您说目录为空。

免责声明:我尚未使用NFS驱动器对此进行验证。您可以通过

验证是否一切正常
  1. 删除所有状态目录
  2. 启动Kafka Streams客户端:将所有任务分配给该客户端,并为每个任务创建状态目录。
  3. 添加第二个Kafka Streams客户端:在两个客户端之间重新平衡任务。重新平衡之后的state.cleanup.delay.ms时间间隔之后,清理线程应尝试删除分配给第二个客户端的任务的状态目录。现在,您应该在日志中获得java.nio.file.DirectoryNotEmptyException异常堆栈跟踪。
  4. 停止第二个客户端:将第二个客户端的任务重新分配回第一个客户端。第一个客户端重用了清理线程无法删除的状态目录。
  5. 停止第一个客户端。
  6. 重新启动第一个客户端:客户端应重用清理线程无法删除的状态目录。

在这一切

  • 验证处理结果是否预期
  • 照顾即将死去的StreamThreads(例如,使用KafkaStreams#setUncaughtExceptionHandler()
  • 紧接Failed to release the state directory lock.之后照看java.nio.file.DirectoryNotEmptyException之类的日志消息。

最后,我建议不要对状态目录使用NFS,而应使用本地磁盘。