У меня в миникубе настроена кафка. Он запущен и работает, и я могу создавать в нем сообщения и потреблять их обратно.
Однако, когда я вхожу в систему с одним брокером (используя 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. Я понятия не имею, почему это вообще необходимо для сценария, предназначенного только для получения данных.
Такая же ошибка возникает во всех скриптах в каталоге bin kafka.
Любые идеи относительно того, как исправить, будут большим подспорьем.
По моему опыту, причина в том, что экспортер 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» и переменные env инициализации, одна из них - «KAFKA_OPTS» - эта опция определяет порт JMX. И затем вы выполняете сценарии, они запускают javaagent под JMX-портом ==> поднимают проблему, как показано ниже
Вызвано: java.net.BindException: адрес уже используется
Как исправить: Я немного редактирую код, устанавливаю KAFKA_OPTS=""
перед выполнением команды java, и она работает.
В команде вместо --bootstrap-server можно использовать --broker-list
Ваш javaagent
использует 2 переменных env, которые конфликтуют со скриптами консоли bin. Эти env vars KAFKA_OPTS
и JMX_PORT
.
Что мне помогло для сливного контейнера (confluentinc/cp-server:5.5.1
) сбрасывает их обоих при входе в работающий контейнер (через docker exec
)
unset KAFKA_OPTS
unset JMX_PORT
Это не повлияет на работающий брокер, потому что эти переменные имеют область сеанса.