生成消息时找不到主题:UNKNOWN_TOPIC_OR_PARTITION

Posted

技术标签:

【中文标题】生成消息时找不到主题:UNKNOWN_TOPIC_OR_PARTITION【英文标题】:Topic can't be found when producing messages: UNKNOWN_TOPIC_OR_PARTITION 【发布时间】:2017-05-23 18:47:26 【问题描述】:

我有一个双节点 Kafka 集群(EC2 实例),其中每个节点都用作单独的代理。当我使用以下命令在领导者实例上运行生产者时:

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

我收到以下错误。

测试消息 [2017-01-09 13:22:39,483] WARN 获取相关 ID 为 0 的元数据时出错:test=UNKNOWN_TOPIC_OR_PARTITION (org.apache.kafka.clients.NetworkClient) [2017-01-09 13:22:39,562] WARN 获取相关 ID 为 1 的元数据时出错:test=UNKNOWN_TOPIC_OR_PARTITION (org.apache.kafka.clients.NetworkClient) [2017-01-09 13:22:39,663] WARN 获取相关 ID 为 2 的元数据时出错:test=UNKNOWN_TOPIC_OR_PARTITION (org.apache.kafka.clients.NetworkClient) ...

使用kafka-topics.sh 列出主题表明该主题存在。

主题描述:

kafka-topics.sh --zookeeper localhost:2181 --describe --topic test

返回

 Topic:test PartitionCount:8    ReplicationFactor:1 Configs:
     Topic: test    Partition: 0    Leader: 1   Replicas: 1 Isr: 1
     Topic: test    Partition: 1    Leader: 2   Replicas: 2 Isr: 2
     Topic: test    Partition: 2    Leader: 1   Replicas: 1 Isr: 1
     Topic: test    Partition: 3    Leader: 2   Replicas: 2 Isr: 2
     Topic: test    Partition: 4    Leader: 1   Replicas: 1 Isr: 1
     Topic: test    Partition: 5    Leader: 2   Replicas: 2 Isr: 2
     Topic: test    Partition: 6    Leader: 1   Replicas: 1 Isr: 1
     Topic: test    Partition: 7    Leader: 2   Replicas: 2 Isr: 2

我正在使用 Kafka 0.10.1.1。

server.properties 文件包含:

listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://0.0.0.0:9092
port=9092
host.name=kafka-node1(kafka-node1 for the second host)
advertised.host.name=kafka-node1(kafka-node2 for the second host)
advertised.port=9092

当我尝试从第二台主机生成消息时,我收到以下消息:

WARN 产生错误响应,相关 id 为 1 主题分区 test-4,重试(还剩 2 次尝试)。错误: NOT_LEADER_FOR_PARTITION (org.apache.kafka.clients.producer.internals.Sender) ....

有人可以帮忙吗?

【问题讨论】:

尝试指定--broker-list中的所有代理。当生产者尝试向未由代理提供服务的分区发送消息时,可能会出现此错误。 AFAIK,advertised.* 设置已弃用。 当我把两个主机都放在--broker-list 时,我仍然得到同样的错误。 你不需要port、host.name、advertised.host.name和advertized.port设置,只在机器外的客户端看到与地址不同的地址时才使用listers和advertedd.listeners服务正在监听的地方。然后,对于您的设置,请尝试使用与运行代理的机器的私有 IP 相等的代理列表。 如果哨兵处于活动状态并且用户没有正确的权限,也会出现此错误消息。 kafka-console-producer.sh --broker-list kafka-node1:9092 --topic test 怎么样? 【参考方案1】:

如果您收到UNKNOWN_TOPIC_OR_PARTITION,则将以下属性添加到server.properties 文件:

listeners=PLAINTEXT://host.name:port
advertised.listeners=PLAINTEXT://host.name:port 

在我的情况下,值如下:

listeners=PLAINTEXT://localhost:9092
advertised.listeners=PLAINTEXT://localhost:9092

【讨论】:

【参考方案2】:

您的主题已标记为删除:

KAFKA_OPTS="-Djava.security.auth.login.config=/home/kafka/kafka_2.11-1.0.0/config/jaas.conf -Djava.security.krb5.conf=/etc/krb5.conf" \
    bin/kafka-topics.sh --describe \
    --zookeeper zookeeper-server-01.eigenroute.com:2181,zookeeper-server-02.eigenroute.com:2181,zookeeper-server-03.eigenroute.com:2181/apps/kafka-cluster-demo
Topic:another-test-topic    PartitionCount:9    ReplicationFactor:2 Configs:    MarkedForDeletion:true
    Topic: another-test-topic   Partition: 0    Leader: none    Replicas: 2,1   Isr:
    Topic: another-test-topic   Partition: 1    Leader: none    Replicas: 1,2   Isr:
    Topic: another-test-topic   Partition: 2    Leader: none    Replicas: 2,1   Isr:
...

【讨论】:

【参考方案3】:

将主题 test 的复制因子设为 2,您将不会再遇到此异常。 由于您有 2 个 broker 集群,请执行以下命令来生成消息:

kafka-console-producer.sh   --broker-list localhost:9092,localhost:9093 --topic test

这会将消息发送到集群中的两个代理。

【讨论】:

Kafka 生产者将每条消息发送到具有该特定主题的分区领导者的服务器。所以你的最后一句话是不正确的。代理列表用于初始发现。 这个解决方案能解决问题吗?对我来说,这似乎不正确。如果我们有一个有 50 个节点的集群,我们需要使复制因子等于 50? 我同意上面的@giannisapi - 什么是正确的解决方案? @CoryRobinson 我不知道您的情况是什么问题,但问题似乎出在经纪人之间或经纪人与动物园管理员之间的通信中。检查所有zookeeper和kafka节点的日志,它会给你一个提示。

以上是关于生成消息时找不到主题:UNKNOWN_TOPIC_OR_PARTITION的主要内容,如果未能解决你的问题,请参考以下文章

运行xcode应用程序时找不到设备消息[重复]

使用 npm 命令时找不到模块“npmlog”错误消息

使用 DDL 数据库生成代码时找不到函数 - jooq

使用 Django / virtualenv 运行 celery 时找不到“__main__”模块

在 Heroku 上部署 Symfony5/php7 应用程序时找不到模板“base.html.twig”错误消息

学习OpenGL时找不到glClear