У меня есть искровое приложение, работающее на удаленном сервере, и мне нужно получить его кучу дампа для повышения производительности. Я смог запустить службу jstatd на удаленной машине и подключиться к ней с помощью visualvm. Однако jstatd не разрешает сброс кучи удаленных компьютеров (я использую visual vm 1.3.8).Не удается подключиться к удаленному jmx-серверу с помощью jvisualvm или jconsole (netcat working)
Чтобы решить эту проблему, я начал свое приложение со следующими дополнительными опциями:
--conf "spark.driver.extraJavaOptions=-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=54321 \
-Dcom.sun.management.jmxremote.rmi.port=54320 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=$HOSTNAME"
После выполнения этого я использовал NetStat, чтобы собрать все открытые порты в процессе и получил следующий результат:
sudo netstat -lp | grep 37407
tcp 0 0 *:54321 *:* LISTEN 37407/java
tcp 0 0 *:54320 *:* LISTEN 37407/java
Чтобы проверить, доступен ли удаленный порт через локальный компьютер, я использовал утилиту netcat, и соединение с удаленным хостом на обоих 54321 и 54320 было успешным.
Однако, когда я пытаюсь подключиться к хосту с помощью visualvm или jconsole, он не может подключиться. Visual vm сообщает о следующей ошибке:
cannot connect to hostname:54321 using service:jmx:rmi:///jndi/rmi://hostname:54321/jmxrmi
Что я здесь делаю неправильно?
Моя проблема была другой. Мне нужно запустить это в приложении под управлением Spark. Команда spark-submit вместе с параметрами jmx должна выполняться на той же машине, что и мастер приложения. В противном случае служба запускается, но не ведет себя так, как предполагалось. – Sohaib