生成消息时找不到主题: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的主要内容,如果未能解决你的问题,请参考以下文章
使用 Django / virtualenv 运行 celery 时找不到“__main__”模块