Сценарии 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

Это не повлияет на работающий брокер, потому что эти переменные имеют область сеанса.

Другие вопросы по тегам