【问题标题】:Exception during topic deletion when Kafka is hosted in Docker in Windows在 Windows 中的 Docker 中托管 Kafka 时删除主题时出现异常
【发布时间】: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 管理运行,但仍然无法正常工作。

标签: windows docker apache-kafka


【解决方案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

        现在可以发布和使用消息

        【讨论】:

          猜你喜欢
          • 2018-11-18
          • 1970-01-01
          • 2015-03-22
          • 2018-07-02
          • 1970-01-01
          • 1970-01-01
          • 2017-06-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多