Сценарии kafka в каталоге "bin" завершаются с ошибкой "Адрес уже используется" (работает в kubernetes)
У меня установлена кафка, работающая в миникубе. Он работает и работает, и я могу создавать в него сообщения и использовать их обратно.
Однако, когда я вхожу в один из брокеров (используя 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" и переменные init env, одна из них - "KAFKA_OPTS" - эта опция определяет порт JMX. И затем вы выполняете сценарии, они запускают javaagent под порт JMX ==> поднять проблему, как показано ниже
Вызвано: java.net.BindException: адрес уже используется
Как исправить: я немного редактирую код, устанавливаю KAFKA_OPTS=""
перед выполнением команды Java, и это работает.
В команде вместо --bootsrap-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
Это не повлияет на работающий брокер, потому что эти переменные имеют область сеанса.