我正在尝试使用Kafka。所有配置都正确完成但是当我尝试从控制台生成消息时,我不断收到错误
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
public class UniqueList<T> extends ArrayList<T> {
private static final long serialVersionUID = 1L;
/** Unique elements SET */
private final Set<T> set=new HashSet();
/** Used by addAll methods */
private Collection<T> addUnique(Collection<? extends T> col) {
Collection<T> unique=new ArrayList();
for(T e: col){
if (set.add(e)) unique.add(e);
}
return unique;
}
@Override
public boolean add(T e) {
return set.add(e) ? super.add(e) : false;
}
@Override
public boolean addAll(Collection<? extends T> col) {
return super.addAll(addUnique(col));
}
@Override
public void add(int index, T e) {
if (set.add(e)) super.add(index, e);
}
@Override
public boolean addAll(int index, Collection<? extends T> col) {
return super.addAll(index, addUnique(col));
}
}
kafka版本:2.11-0.9.0.0
答案 0 :(得分:72)
它可能与您advertised.host.name
中的server.properties
设置有关。
可能发生的是,您的制作人正试图找出谁是某个分区的领导者,找出其advertised.host.name
和advertised.port
并尝试连接。
如果未正确配置这些设置,则可能会认为领导者不可用。
答案 1 :(得分:60)
我尝试了此处列出的所有建议。对我有用的是转到server.properties
并添加:
port = 9092
advertised.host.name = localhost
将listeners
和advertised_listeners
注释掉。
答案 2 :(得分:36)
我让kafka作为Docker容器运行,类似的消息充斥着日志
KAFKA_ADVERTISED_HOST_NAME
被设为'kafka'。
在我的情况下,错误的原因是'kafka'容器本身中'kafka'缺少/etc/hosts
记录。
因此,例如,在'kafka'容器内运行ping kafka
将失败并显示ping: bad address 'kafka'
就Docker而言,通过为容器指定hostname
来解决此问题。
实现它的选项:
答案 3 :(得分:29)
What solved it for me is to set listeners like so:
advertised.listeners = PLAINTEXT://my.public.ip:9092
listeners = PLAINTEXT://0.0.0.0:9092
This makes KAFKA broker listen to all interfaces.
答案 4 :(得分:15)
我正在使用kafka_2.12-0.10.2.1:
vi config / server.properties
添加以下行:
listeners=PLAINTEXT://localhost:9092
经纪人将向生产者和消费者宣传的主机名和端口。如果没有设置,
。否则,它将使用从java.net.InetAddress.getCanonicalHostName()返回的值。
停止Kafka经纪人:
bin/kafka-server-stop.sh
重启经纪人:
bin/kafka-server-start.sh -daemon config/server.properties
现在你不应该看到任何问题。
答案 5 :(得分:12)
当我们尝试订阅尚未创建的主题时,我们倾向于收到此消息。我们通常依赖于在我们部署的环境中先验创建的主题,但我们有针对dockerized kafka实例运行的组件测试,每次都会启动干净。
在这种情况下,我们在测试设置中使用AdminUtils来检查主题是否存在,如果不存在则创建它。有关设置AdminUtils的更多信息,请参阅此other堆栈溢出。
答案 6 :(得分:11)
在与Kafka一起工作的过去两个星期中,我一直在目睹同样的问题,从那以后,我一直在阅读这篇Stackoverflow的帖子。
经过2周的分析,我推断出我的情况 尝试针对不存在的主题产生消息。
在我的情况下,结果是Kafka发回错误消息,但在 同时,之前不存在的主题。因此,如果我在此事件之后尝试再次向该主题发出任何消息,则该错误将不再显示为已创建的主题。
请注意:可能是我的特定Kafka安装配置为在不存在的情况下自动创建该主题,这解释了为什么在我的情况下我仅在一开始:您的配置可能会有所不同,在这种情况下,您将一遍又一遍地出现相同的错误。
此致
Luca Tampellini
答案 7 :(得分:8)
此警告的另一种可能性(在0.10.2.1中)是您尝试对刚刚创建的主题进行轮询,并且该主题分区的领导者尚未可用,您正处于领导选举的中间
在主题创建和轮询之间等待一秒是一种解决方法。
答案 8 :(得分:6)
对于任何试图在kubernetes上运行kafka并遇到此错误的人来说,这就是最终为我解决的问题:
您必须:
hostname
添加到pod规范中,就像kafka可以找到的那样。或
hostPort
,则需要hostNetwork: true
和dnsPolicy: ClusterFirstWithHostNet
原因是因为Kafka需要与自己交谈,并且它决定使用'advertised'监听器/主机名来查找自己,而不是使用localhost。 即使您有一个服务指出广告主机名在广告连播中,它也不会从广告连播中看到。我真的不知道为什么会这样,但至少有一种解决方法。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: zookeeper-cluster1
namespace: default
labels:
app: zookeeper-cluster1
spec:
replicas: 1
selector:
matchLabels:
app: zookeeper-cluster1
template:
metadata:
labels:
name: zookeeper-cluster1
app: zookeeper-cluster1
spec:
hostname: zookeeper-cluster1
containers:
- name: zookeeper-cluster1
image: wurstmeister/zookeeper:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 2181
- containerPort: 2888
- containerPort: 3888
---
apiVersion: v1
kind: Service
metadata:
name: zookeeper-cluster1
namespace: default
labels:
app: zookeeper-cluster1
spec:
type: NodePort
selector:
app: zookeeper-cluster1
ports:
- name: zookeeper-cluster1
protocol: TCP
port: 2181
targetPort: 2181
- name: zookeeper-follower-cluster1
protocol: TCP
port: 2888
targetPort: 2888
- name: zookeeper-leader-cluster1
protocol: TCP
port: 3888
targetPort: 3888
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: kafka-cluster
namespace: default
labels:
app: kafka-cluster
spec:
replicas: 1
selector:
matchLabels:
app: kafka-cluster
template:
metadata:
labels:
name: kafka-cluster
app: kafka-cluster
spec:
hostname: kafka-cluster
containers:
- name: kafka-cluster
image: wurstmeister/kafka:latest
imagePullPolicy: IfNotPresent
env:
- name: KAFKA_ADVERTISED_LISTENERS
value: PLAINTEXT://kafka-cluster:9092
- name: KAFKA_ZOOKEEPER_CONNECT
value: zookeeper-cluster1:2181
ports:
- containerPort: 9092
---
apiVersion: v1
kind: Service
metadata:
name: kafka-cluster
namespace: default
labels:
app: kafka-cluster
spec:
type: NodePort
selector:
app: kafka-cluster
ports:
- name: kafka-cluster
protocol: TCP
port: 9092
targetPort: 9092
答案 9 :(得分:5)
添加此项,因为它可能会帮助其他人。常见问题可能是advertised.host.name
的配置错误。使用Docker-compose设置Docker时,除非您同时设置主机名,否则KAFKA_ADVERTISED_HOST_NAME
内的服务名称将无效。 docker-compose.yml
示例:
kafka:
image: wurstmeister/kafka
ports:
- "9092:9092"
hostname: kafka
environment:
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_CREATE_TOPICS: "test:1:1"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock:/var/run/docker.sock
上述没有hostname: kafka
的人可以在尝试连接时发出LEADER_NOT_AVAILABLE
。
您可以找到有效docker-compose
配置here
答案 10 :(得分:3)
就我而言,它在家里可以正常工作,但是当我连接到办公室网络时,它在办公室就无法使用。
因此修改了config / server.properties listeners = PLAINTEXT://:9092到listeners = PLAINTEXT:// localhost:9092
就我而言,我正在描述消费者群
答案 11 :(得分:2)
由于我希望我的kafka经纪人与远程制作人和消费者联系,所以我不希望advertised.listener
被注释掉。就我而言,(在kubernetes上运行kafka),我发现我的kafka pod没有分配任何群集IP。通过从services.yml中删除行clusterIP: None
,kubernetes将内部ip分配给kafka pod。这解决了我的LEADER_NOT_AVAILABLE问题以及kafka生产者/消费者的远程连接问题。
答案 12 :(得分:2)
我在config/server.properties
中添加了以下这一行,解决了上述类似问题。希望这有帮助,它在server.properties文件中有很好的文档,在修改之前尝试阅读和理解。
advertised.listeners=PLAINTEXT://<your_kafka_server_ip>:9092
答案 13 :(得分:2)
当LEADER_NOT_AVAILABLE错误抛出时,只需重新启动kafka代理:
/bin/kafka-server-stop.sh
接着是
/bin/kafka-server-start.sh config/server.properties
(注意:Zookeeper必须在这个时候运行,如果你做其他事情它不会工作)
答案 14 :(得分:2)
我正在使用docker-compose使用wurstmeister/kafka
图像构建Kafka容器。将KAFKA_ADVERTISED_PORT: 9092
属性添加到我的docker-compose
文件可以解决此错误。
答案 15 :(得分:1)
将侦听器设置添加到配置目录中的server.properties文件后,问题得以解决。 listeners = PLAINTEXT:// localhost(或您的服务器):9092 进行此更改后,重新启动kafka。使用的版本2.11
答案 16 :(得分:1)
对于那些在Kafka ssl设置中挣扎并看到此LEADER_NOT_AVAILABLE错误的人。可能被破坏的原因之一是密钥库和信任库。在密钥库中,您需要拥有服务器的私钥+签名服务器证书。在客户端信任库中,您需要具有中间CA证书,以便客户端可以对kafka服务器进行身份验证。如果您将使用ssl进行interbroker通信,则需要在服务器的server.properties中设置此信任库,以便它们可以相互进行身份验证。
最后一件我错误地错过了,并且让我花了很多时间来找出这个LEADER_NOT_AVAILABLE错误可能意味着什么。希望这可以帮助某人。
答案 17 :(得分:1)
如果在本地计算机上运行kafka,请尝试使用以下行更新$ KAFKA_DIR / config / server.properties:
listeners=PLAINTEXT://localhost:9092
,然后重新启动kafka。
答案 18 :(得分:1)
如果您反复收到这样的错误消息:
Error while fetching metadata with correlation id 3991 : {your.topic=LEADER_NOT_AVAILABLE}
或
Discovered group coordinator 172.25.1.2:9092 (id: 2147483645 rack: null) (org.apache.kafka.clients.consumer.internals.AbstractCoordinator:677)
(Re-)joining group (org.apache.kafka.clients.consumer.internals.AbstractCoordinator:509)
Group coordinator 172.25.1.2:9092 (id: 2147483645 rack: null) is unavailable or invalid, will attempt rediscovery (org.apache.kafka.clients.consumer.internals.AbstractCoordinator:729)
Discovered group coordinator 172.25.40.219:9092 (id: 2147483645 rack: null) (org.apache.kafka.clients.consumer.internals.AbstractCoordinator:677)
Group coordinator 172.25.1.2:9092 (id: 2147483645 rack: null) is unavailable or invalid, will attempt rediscovery (org.apache.kafka.clients.consumer.internals.AbstractCoordinator:729)
然后,您需要在kafka server.properties中配置这样的侦听器设置:
listeners=PLAINTEXT://your.server.ip:9092
这是在Apacke Kafka 2.5.0和融合平台5.4.1上尝试过的解决方案。
答案 19 :(得分:0)
我今天遇到了同样的问题。我为解决这个错误所做的是在class Struct(object): # hit
def __init__(self, content=None): # hit
if content is not None: # partial hit
self.content = content # missed
s = Struct() # hit
文件中进行微妙的修改:
将第/etc/hosts
行更改为127.0.0.1 localhost localhost.localdomain
(假设10.0.11.12 localhost localhost.localdomain
是Kafka服务器侦听的主机IP地址之一)
答案 20 :(得分:0)
尝试使用此侦听器= PLAINTEXT:// localhost:9092 一定有帮助
非常感谢
答案 21 :(得分:0)
我知道这是很久以前发布的,我想分享我如何解决它。
因为我有我的办公室笔记本电脑(已配置 VPN和代理)。
我检查了环境变量 NO_PROXY
> echo %NO_PROXY%
返回空值
现在我用 localhost 和 127.0.0.1
> set NO_PROXY=127.0.0.1,localhost
如果要附加到现有值,则
> set NO_PROXY=%NO_PROXY%,127.0.0.1,localhost
此后,我重新启动了zookeeper和kafka
像魅力一样
答案 22 :(得分:0)
对我来说,我没有为Kafka实例指定经纪人ID。
在Docker环境中重新启动时,有时会从zookeeper获得新的ID。
如果您的经纪人ID大于1000,则只需指定环境变量KAFKA_BROKER_ID
。
使用它可以查看代理,主题和分区。
brew install kafkacat
kafkacat -b [kafka_ip]:[kafka_poot] -L
答案 23 :(得分:0)
以上答案中提到的广告收听者可能是原因之一。其他可能的原因是:
bin/kafka-topics --list --zookeeper <zookeeper_ip>:<zookeeper_port>
此外,请确保将通告的侦听器设置为IP:9092
,而不是localhost:9092
。后者意味着只能通过本地主机访问代理。
遇到错误时,我记得在引导服务器列表(或代理列表)中使用了 PLAINTEXT://<ip>:<PORT>
,而且很奇怪。
bin/kafka-console-producer --topic sample --broker-list PLAINTEXT://<IP>:<PORT>
答案 24 :(得分:0)
对我来说,原因是使用了不属于Kafka软件包的特定Zookeeper。该Zookeeper已经安装在计算机上用于其他用途。显然,Kafka不适用于任何Zookeeper。切换到Kafka随附的Zookeeper为我解决了。为了不与现有的Zookeeper冲突,我不得不修改配置以使Zookeeper在其他端口上监听:
[root@host /opt/kafka/config]# grep 2182 *
server.properties:zookeeper.connect=localhost:2182
zookeeper.properties:clientPort=2182
答案 25 :(得分:0)
对我来说,这是由于错过配置而发生的
Docker端口(9093)
Kafka命令端口&#34; bin / kafka-console-producer.sh --broker-list localhost: 9092 - topic TopicName&#34;
我检查了我的配置以匹配端口,现在一切正常