似乎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)
答案 0 :(得分:0)
这是Windows和NFS上状态目录的一个已知问题,并且已提交here错误。
此错误的影响是,Kafka Streams客户端无法通过其清理线程或显式调用KafkaStreams#cleanUp()
来删除其使用的状态目录。基本上,客户端会创建只能通过手动删除目录来释放的目录。
尝试删除目录后应释放文件锁。这样目录就可以被Kafka Streams客户端重用。
从正确性的角度来看,这应该不是问题,因为您说目录为空。
免责声明:我尚未使用NFS驱动器对此进行验证。您可以通过
验证是否一切正常state.cleanup.delay.ms
时间间隔之后,清理线程应尝试删除分配给第二个客户端的任务的状态目录。现在,您应该在日志中获得java.nio.file.DirectoryNotEmptyException
异常堆栈跟踪。在这一切
KafkaStreams#setUncaughtExceptionHandler()
)Failed to release the state directory lock.
之后照看java.nio.file.DirectoryNotEmptyException
之类的日志消息。最后,我建议不要对状态目录使用NFS,而应使用本地磁盘。