在 Windows 中的 Docker 中托管 Kafka 时删除主题时出现异常

Posted

技术标签:

【中文标题】在 Windows 中的 Docker 中托管 Kafka 时删除主题时出现异常【英文标题】:Exception during topic deletion when Kafka is hosted in Docker in Windows 【发布时间】:2018-06-15 07:00:12 【问题描述】:

我在 Windows 的 Docker 中托管 Kafka。使用Wurstmeister/Kafka docker 镜像。 Kafka 数据存储在本地 Windows 文件夹中以保持持久性。 Windows 文件夹通过 Docker 卷映射到 Kafka docker 映像。我可以创建主题、发布和使用消息。但是,当我尝试删除主题时,我收到以下错误:

 Error while deleting test-0 in dir /var/lib/kafka. (kafka.server.LogDirFailureChannel)
 java.io.IOException: Failed to rename log directory from /var/lib/kafka/test-0 to /var/lib/kafka/test-0.a81ff9700e4e4c3e8b20c6d949971b64-delete
 at kafka.log.LogManager.asyncDelete(LogManager.scala:671)
 at kafka.cluster.Partition.$anonfun$delete$1(Partition.scala:178)
 at kafka.utils.CoreUtils$.inLock(CoreUtils.scala:217)
 at kafka.utils.CoreUtils$.inWriteLock(CoreUtils.scala:225)
 at kafka.cluster.Partition.delete(Partition.scala:173)
 at kafka.server.ReplicaManager.stopReplica(ReplicaManager.scala:341)
 at kafka.server.ReplicaManager.$anonfun$stopReplicas$2(ReplicaManager.scala:373)
 at scala.collection.Iterator.foreach(Iterator.scala:929)
 at scala.collection.Iterator.foreach$(Iterator.scala:929)
 at scala.collection.AbstractIterator.foreach(Iterator.scala:1417)
 at scala.collection.IterableLike.foreach(IterableLike.scala:71)
 at scala.collection.IterableLike.foreach$(IterableLike.scala:70)
 at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
 at kafka.server.ReplicaManager.stopReplicas(ReplicaManager.scala:371)
 at kafka.server.KafkaApis.handleStopReplicaRequest(KafkaApis.scala:190)
 at kafka.server.KafkaApis.handle(KafkaApis.scala:104)
 at kafka.server.KafkaRequestHandler.run(KafkaRequestHandler.scala:65)
 at java.lang.Thread.run(Thread.java:748)

有人可以帮我解决这个问题吗?

UPD:您可以在下面找到我用来运行 Kafka 的 docker-compose 文件的内容:

version: '3'
services:
  zookeeper:
    image: zookeeper
    ports:
      - "2181:2181"
    environment:
      ZOO_MY_ID: 1
    volumes:
      - ./zookeeper_data:/data
      - ./zookeeper_datalog:/datalog
  kafka:
    depends_on: 
      - zookeeper
    image: wurstmeister/kafka
    ports:
      - "9092:9092"
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_HOST_NAME: localhost
      KAFKA_LOG_DIRS: /var/lib/kafka
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'false'
      KAFKA_BROKER_ID: 1
    volumes:
      - ./kafka_logs:/var/lib/kafka

【问题讨论】:

Kafka 是否没有足够的权限来执行此操作?请。提供你如何启动这个容器 我有一个 docker-compose 文件并使用 docker-compose up -d 启动它。我可以创建主题和发布消息,因此 Kafka 可以访问文件夹。我将使用 docker-compose 文件内容更新帖子。 您正在将 /var/lib/kafka 映射到您的主机文件系统。确保允许 kafka 的用户 ID(1000?)写入您的主机路径 kafka_logs。基本上,您需要在主机上为具有相同 ID 的用户提供足够的权限。 好的。但正如我所说,我可以创建主题并生成消息。如果我错了,请纠正我 Kafka 可以写入 kafka_logs 吗? @aholbreich 我遇到了同样的问题。请问如何授予足够的权限删除该主题?我试图将 delete.topic.enable 的 Zookeeper 属性设置为 true,它没有帮助。我还尝试将 Eclipse 作为 en 管理运行,但仍然无法正常工作。 【参考方案1】:

当我尝试删除主题时,此问题在 Windows for Kafka ver 1.1.0 (kafka_2.12-1.1.0) 中仍然存在。

主题被标记为删除,Kafka 服务器在尝试重命名日志目录“test-0”时出现 java.nio.file.AccessDeniedException 失败

删除整个 test-0 日志文件夹没有帮助。 重新安装 Kafka 服务器也无济于事 - 即使重新安装后,有关标记为删除的主题的信息仍然存在。

我花了几个小时才弄清楚关于该主题的信息位于 Zookeeper 中 - 在其中一个日志文件中!

解决方案

停止 Zookeeper 进程。 转到您的 Zookeeper 日志文件夹 zookeeper-3.x.x\bin\zookeeper-3.x.xdata\version-2\ 并删除最新的 log.xx 文件。 重新启动 Zookeper。 重启 Kafka 服务器。

【讨论】:

如果我有 confluent 版本,谁能告诉我 zookeeper 日志在哪里? Kafka 2.2 仍然存在问题(使用 EmbeddedKafkaRule github.com/spring-projects/spring-kafka/blob/master/src/…)。在 Linux 环境中运行良好。 @ylka,它应该在 Kafka 日志所在的同一文件夹下。更具体地说,如果您在 server.properties 中设置“C:\tmp\kafka-logs”,您将看到位于“C:\tmp\zookeeper”的文件夹。 我使用的是 Kafka 2.3.1,这个解决方案有效。谢谢,布兰登。 windows 上的这个日志文件夹在哪里??因为我找不到。顺便说一句,我的 Zookeeper 在 docker 容器中运行?【参考方案2】:

从 Zookeeper 日志文件夹中删除版本 2。 删除 Kafka-logs 文件夹中的所有内容。

然后重启 Zookeeper 和 Kafka 服务器:

zookeeper-server-start.bat D:\kafka_2.11-2.4.1\config\zookeeper.properties kafka-server-start.bat D:\kafka_2.11-2.4.1\config\server.properties

【讨论】:

【参考方案3】:

由于 Java 的 File.rename 功能,主题删除失败。在某些情况下,它在 Windows 环境中的工作方式有所不同(例如,如果文件正在使用中)。 Kafka 开发人员已经将此功能更改为 Utils.atomicMoveWithFallback(有关详细信息,请参阅issue),但似乎它并未包含在 Kafka 2.11-0.11.0 中。因此,您需要使用具有此修复程序的 Kafka 版本。希望这会有所帮助。

【讨论】:

除了@Oleksandr 的回答,还有一个与Windows 环境中文件移动/删除相关的未解决问题:KAFKA-1194 您链接到的问题表明它已修复,但是这仍然是 Windows 上的问题。你可以创建一个简单的主题,然后立即删除它,你会得到ERROR Error while renaming dir for test-0 in log dir C:\tmp\kafka-logs (kafka.server.LogDirFailureChannel) java.nio.file.AccessDeniedException: C:\tmp\kafka-logs\test-0 -> C:\tmp\kafka-logs\test-0.9b7da533fd9d4b1f8ad0e783f16ad1ee-delete【参考方案4】:

我在重置共享云端硬盘的凭据后解决了这个问题

Docker 配置 > 共享驱动器 > 重置凭据

【讨论】:

【参考方案5】:

这解决了问题 1.停止 Kafka 和 Zookeeper 进程。 2.删除所有旧的日志目录。 3.更改 log.dir 以指向 server.properties 中的新目录 4.改变dataDir指向zookeeper.properties中的新目录

然后重启 Zookeeper 和 Kafka 服务器:

C:\kafka_2.12-2.4.0> zookeeper-server-start.bat .\config\zookeeper.properties C:\kafka_2.12-2.4.0> kafka-server-start.bat .\config\server.properties

【讨论】:

【参考方案6】:

1、在server.properties ->Kafka/config中将log.dir改成新名字

log.dir=C:/Programs/kafka/kafka_2.12-2.3.0/kafka-test-logs

2、从C:/Programs/kafka/kafka_2.12-2.3.0/中删除旧的日志文件夹

3,从 C:\Programs\zookeeper\apache-zookeeper-3.5.5-bin\data 中删除所有日志和快照 或删除存储日志的数据文件夹

另外,我在启动consumer时出错(Leader Not Available Kafka in Console Producer),

我加了,

端口 = 9092 广告.host.name = localhost

到 server.properties

现在可以发布和使用消息

【讨论】:

以上是关于在 Windows 中的 Docker 中托管 Kafka 时删除主题时出现异常的主要内容,如果未能解决你的问题,请参考以下文章

无法连接到 docker 托管的 MSSQL

防止直接调用托管在 docker 容器中的微服务的最佳方法

如何通过 Spark 中的 jdbc 连接到 docker 托管的 postgresql 数据库?

无法将azure注册表中的docker镜像托管到azure批处理

如何在托管的 Ubuntu 代理上启用 Azure Pipelines 中的实验性 Docker 守护程序

Docker 中的 Docker | Github 操作 - 自托管运行器