Назад | Перейти на главную страницу

Сценарии kafka в каталоге «bin» не работают с «Адрес уже используется» (выполняются в кубернетах)

У меня в миникубе настроена кафка. Он запущен и работает, и я могу создавать в нем сообщения и потреблять их обратно.

Однако, когда я вхожу в систему с одним брокером (используя 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

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