无法使用jvisualvm或jconsole连接到远程jmx服务器(netcat工作)

时间:2016-02-29 13:33:01

标签: visualvm jconsole jvisualvm

我在远程服务器上运行了一个spark应用程序,我需要为了性能目的而获取其堆转储。我能够在远程计算机上运行jstatd服务并使用visualvm连接到它。但是,jstatd不启用远程计算机的堆转储(我使用的是visual vm 1.3.8)。

要解决此问题,我使用以下额外选项启动了我的应用程序:

--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

我在这里做错了什么?

2 个答案:

答案 0 :(得分:0)

为了启用jconsole连接:尝试添加此标志

-Dcom.sun.management.jmxremote.local.only=false

并且为了堆转储,你不需要通过jconsole连接,只需使用jmap:

 $>jmap -dump:format=b,live,file=<filename> <process-id>

最后,如果spark有守护进程控制它,请确保它在堆转储创建过程中不会终止进程。

答案 1 :(得分:0)

问题是$ HOSTNAME是你运行spark submit的服务器的主机名,你需要设置为运行spark驱动程序的机器的主机名:

-Djava.rmi.server.hostname=<hostname of spark driver> 

顺便说一下,这就是当你的火花应用程序和火花提交在同一台服务器上时,它只适用于你的原因。