【问题标题】:Kafka topic creation: Timed out waiting for a node assignmentKafka主题创建:等待节点分配超时
【发布时间】:2019-05-04 07:07:51
【问题描述】:

我已经使用以下 docker-compose.yml 运行了一个本地 kafka

version: '2'
services:
  zookeeper:
    image: "confluentinc/cp-zookeeper:5.0.1"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  kafka:
    image: "confluentinc/cp-enterprise-kafka:5.0.1"
    ports:
      - '9092:9092'
    depends_on:
      - zookeeper
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
      KAFKA_METRIC_REPORTERS: io.confluent.metrics.reporter.ConfluentMetricsReporter
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 100

尝试在 Scala 中使用 kafka-client 2.1.0 运行基本创建主题:

val props = new Properties()
props.setProperty(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092")

val adminClient: AdminClient = AdminClient.create(props)
val newTopic = new NewTopic("test", 1, 1.toShort)
val topicsF = adminClient.createTopics(List(newTopic).asJavaCollection)
val result = topicsF.all().get()

但过了一段时间我得到:

org.apache.kafka.common.errors.TimeoutException: Timed out waiting for a node assignment.

我可以使用命令行创建主题:

kafka-topics --create \
    --zookeeper localhost:2181 \
    --replication-factor 1 \
    --partitions 1 \
    --topic test
Created topic "test".

kafka AdminClient API Timed out waiting for node assignment 描述了一个使用 Java 的类似问题,但评论表明系统重启解决了这个问题,而我的情况并非如此。

【问题讨论】:

  • 供将来参考:对于那些查看此问题并想知道为什么问题和答案中的环境看起来相同的人 - @Milan 在回答后编辑了问题,请参阅问题历史

标签: scala docker apache-kafka


【解决方案1】:

我认为localhost 是问题所在。在您的 bootstrap-servers 属性中,使用您在撰写文件中定义的广告主机 (192.168.99.100),而不是 localhost,这应该可以工作。

【讨论】:

  • 你能看一下容器内部吗,server.properties 中定义的广告主机是什么?然后你可以尝试从外部远程登录到 9092,看看它是否能够连接。
  • server.properties 中的容器内部:adverted.listeners=PLAINTEXT://192.168.99.100:9092。 > telnet 192.168.99.100:9092 192.168.99.100:9092:提供节点名或服务名,或未知
  • 我已经用 docker-compose.yml 文件更新了我的问题。使用此设置,它仍然无法正常工作。
  • 对我来说,在 kafka server.properties 中将“listeners=PLAINTEXT://:9092”更改为“listeners=PLAINTEXT://localhost:9092”。谢谢!
【解决方案2】:

如果您在 Docker(或类似)中运行 Kafka,则需要正确配置侦听器。 This article详细描述。

Here's an example 的 Docker Compose,可用于从主机访问 Kafka。

免责声明:我写了这篇文章 :)

【讨论】:

  • 我已经用 docker-compose.yml 文件更新了我的问题。使用此设置,它仍然无法正常工作。
  • 你在哪里运行你的 Scala 代码?在 Docker 主机上还是在另一个容器上?
  • 我启动所描述的 docker-compose.yml 并从我的 MacOS 本地运行代码,因为我只想快速开发而不需要构建和部署 sbt 容器。
  • 我不熟悉您使用的 Docker 映像。我已经用一些额外的材料更新了我的答案
【解决方案3】:

作为@suh pointed out

一种更简单的方法是在 :listeners=PLAINTEXT://localhost:9092 行取消注释 kafka server.properties,它应该可以工作。

【讨论】:

    【解决方案4】:

    我宣传的听众是错误的,我没有配置KAFKA_LISTENER_SECURITY_PROTOCOL_MAP

    我找到了一个很好的例子here:

    KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT,SSL:SSL,SSL_HOST:SSL,SASL_SSL:SASL_SSL,SASL_SSL_HOST:SASL_SSL
    KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:29092,PLAINTEXT_HOST://localhost:9092,SSL://kafka1:29093,SSL_HOST://localhost:9093,SASL_SSL://kafka1:29094,SASL_SSL_HOST://localhost:9094
    

    P.S:只使用你需要的,对我来说是SASL_SSL & SASL_SSL_HOST

    【讨论】:

      猜你喜欢
      • 2018-12-21
      • 1970-01-01
      • 2022-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多