我在 minikube 中设置了 kafka。它已启动并运行,我能够向其中生成消息并将其消费掉。
但是,当我登录到其中一个代理(使用kubectl exec
如果相关)并尝试使用 bin 中的一个脚本获取有关其状态的一些信息时,出现异常Address already in use
:
root@kafka-0:/kafka# bin/kafka-consumer-groups.sh --list --bootstrap-server kafka:9092
Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:513)
at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:525)
Caused by: java.net.BindException: Address already in use
at java.base/sun.nio.ch.Net.bind0(Native Method)
at java.base/sun.nio.ch.Net.bind(Net.java:461)
at java.base/sun.nio.ch.Net.bind(Net.java:453)
at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227)
at java.base/sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:80)
at jdk.httpserver/sun.net.httpserver.ServerImpl.bind(ServerImpl.java:134)
at jdk.httpserver/sun.net.httpserver.HttpServerImpl.bind(HttpServerImpl.java:54)
at io.prometheus.jmx.shaded.io.prometheus.client.exporter.HTTPServer.<init>(HTTPServer.java:145)
at io.prometheus.jmx.shaded.io.prometheus.jmx.JavaAgent.premain(JavaAgent.java:54)
... 6 more
FATAL ERROR in native method: processing of -javaagent failed
Aborted (core dumped)
快速查看后strace
发现,它正在尝试绑定到端口 80。我不知道为什么对于仅用于获取数据的脚本来说这是必要的。
kafka bin 目录中的所有脚本都发生同样的错误。
关于如何修复的任何想法都会有很大的帮助
答案1
根据我的经验,原因是 JMX 导出器将在 Kafka 服务器已使用的端口下启动。
为了仔细检查,您可以执行命令ps -ef | grep kafka | grep jmx_prometheus
,然后查看结果是否显示如下-javaagent:./jmx_prometheus_javaagent-0.3.1.jar=9083:/usr/hdp/current/kafka-broker/prometheus/kafka.yaml
。
它不像上面的,请跳过我的帖子:),否则我们继续
“$KAFKA_HOME/bin” 中的大多数脚本都会加载文件“$KAFKA_HOME/conf/kafka-env.sh”并初始化环境变量,其中一个是“KAFKA_OPTS” - 此选项定义 JMX 端口。然后您执行脚本,它们将在 JMX 端口下启动 javaagent ==> 引发以下问题
原因:java.net.BindException:地址已被使用
怎么修:
我编辑了一些内部代码,KAFKA_OPTS=""
在执行 java 命令之前进行设置,它就可以工作了。
答案2
在命令中,除了 --bootsrap-server,您还可以使用 --broker-list
答案3
您javaagent
使用的 2 个环境变量与 bin 控制台脚本相冲突。这些环境变量是KAFKA_OPTS
和JMX_PORT
。
对于 confluent container( ),对我有帮助的是,confluentinc/cp-server:5.5.1
在进入正在运行的容器时取消设置它们两个(通过docker exec
)
unset KAFKA_OPTS
unset JMX_PORT
这不会影响正在运行的代理,因为这些变量具有会话范围。