“bin”目录中的 kafka 脚本失败,显示“地址已被使用”(在 kubernetes 中运行)

“bin”目录中的 kafka 脚本失败,显示“地址已被使用”(在 kubernetes 中运行)

我在 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_OPTSJMX_PORT
对于 confluent container( ),对我有帮助的是,confluentinc/cp-server:5.5.1在进入正在运行的容器时取消设置它们两个(通过docker exec

unset KAFKA_OPTS
unset JMX_PORT

这不会影响正在运行的代理,因为这些变量具有会话范围。

相关内容