卡夫卡生产者说“unknown_topic_or_partition”

Posted

技术标签:

【中文标题】卡夫卡生产者说“unknown_topic_or_partition”【英文标题】:Kafka producer says "unknown_topic_or_partition" 【发布时间】:2019-04-09 01:00:05 【问题描述】:

我已经尝试让kafka-docker 工作几天了,但我不知道我做错了什么。现在,我无法使用我的 ruby​​-kafka 客户端访问任何主题,因为节点“不存在”。这是我的 docker-compose.yml 文件:

version: '2'
services:
  zookeeper:
   image: wurstmeister/zookeeper
   ports:
     - "2181:2181"
  kafka:
    image: wurstmeister/kafka:0.9.0.1
    ports:
      - "9092:9092"
    links:
      - zookeeper
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ADVERTISED_HOST_NAME: 192.168.99.100
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'false'
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
  kafka2:
    image: wurstmeister/kafka:0.9.0.1
    ports:
      - "9093:9092"
    links:
      - zookeeper
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ADVERTISED_HOST_NAME: 192.168.99.100
      KAFKA_ADVERTISED_PORT: 9093
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'false'
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
  kafka3:
    image: wurstmeister/kafka:0.9.0.1
    ports:
      - "9094:9092"
    links:
      - zookeeper
    environment:
      KAFKA_BROKER_ID: 3
      KAFKA_ADVERTISED_HOST_NAME: 192.168.99.100
      KAFKA_ADVERTISED_PORT: 9094
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'false'
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

我指定“KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'false'”是因为我想手动创建主题,所以我进入我的第一个代理容器并输入:

./kafka-topics.sh --create --zookeeper 172.19.0.2:2181 --topic test1 --partitions 4 --replication-factor 3

一切似乎都很好:

./kafka-topics.sh --list --zookeeper 172.19.0.2:2181 -> test1

但是,当我尝试这样做时:

./kafka-console-producer.sh --broker-list localhost:9092 --topic test1

上面写着:

在获取关联 ID 为 24 的元数据时出现警告错误:test1=UNKNOWN_TOPIC_OR_PARTITION (org.apache.kafka.clients.NetworkClient)

如果我再次创建主题,它说它已经存在,所以我不知道发生了什么。

【问题讨论】:

代替 localhost 尝试使用 kafka 广告主机。 这似乎有效,但消费者无法使用以下命令显示任何消息:./kafka-console-consumer.sh --zookeeper 172.19.0.2:2181 --bootstrap-server 192.168。 99.100:9092 --topic order --from-beginning. 这里没关系,但不清楚你为什么用这么老版本的Kafka Connect to Kafka running in Docker from local machine的可能重复 注意:使用相同的KAFKA_ADVERTISED_HOST_NAME 运行 3 个 Docker Kafka 容器将无法正常工作。另外,在同一台机器上运行三个,使用相同的网络 I/O 和磁盘实际上比一个容器的吞吐量要低 【参考方案1】:

您需要正确配置网络,因为 Kafka 跨主机工作并且需要能够访问所有主机。

This post详细解释。

您可能还想参考https://github.com/confluentinc/cp-docker-images/blob/5.0.0-post/examples/cp-all-in-one/docker-compose.yml 以获取工作中的 Docker Compose 的示例。

【讨论】:

“您需要正确配置网络”——这对我的情况很有帮助。 :-) 如果我们连接到托管在 Confluent Cloud 中的 Kafka 集群 - 我们将无法指定 KAFKA_LISTENERS 和其他所需配置,这与 Kafka 托管在本地并且可以在码头工人撰写文件。在这种情况下,我们如何指定所需的配置?谢谢。 @GautamTGoudar 请发布一个新问题,详细说明您正在运行的代码和错误etc。谢谢:) 但是你做了什么,完全是@HaroldL.Brown【参考方案2】:

所以我们在使用 kafka connect 时遇到了这个问题。对此有多种解决方案。修剪所有 docker 映像或更改连接配置中的组 ID 以在连接映​​像中进行连接,如下所示:-

    image: debezium/connect:1.1
    ports:
      - 8083:8083
    links:
      - schema-registry
    environment:
      - BOOTSTRAP_SERVERS=kafkaanalytics-mgmt.fptsinternal.com:9092
      - GROUP_ID=1
      - CONFIG_STORAGE_TOPIC=my_connect_configs
      - OFFSET_STORAGE_TOPIC=my_connect_offsets
      - STATUS_STORAGE_TOPIC=my_connect_statuses
      - INTERNAL_KEY_CONVERTER=org.apache.kafka.connect.json.JsonConverter
      - INTERNAL_VALUE_CONVERTER=org.apache.kafka.connect.json.JsonConverter

【讨论】:

以上是关于卡夫卡生产者说“unknown_topic_or_partition”的主要内容,如果未能解决你的问题,请参考以下文章

卡夫卡生产者拦截器

卡夫卡多个生产者写同一主题?

春云流卡夫卡

卡夫卡:如何在卡夫卡实现循环分区

如何暂停卡夫卡消费者?

Kafka Consumer Lag Monitoring