我在远程服务器上运行了一个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
我在这里做错了什么?
答案 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>
顺便说一下,这就是当你的火花应用程序和火花提交在同一台服务器上时,它只适用于你的原因。