2016-02-29 69 views
2

我有一个在远程服务器上运行的spark应用程序,为了提高性能,我需要获取它的堆转储。我能够在远程计算机上运行jstatd服务并使用visualvm连接到它。但是,jstatd不启用远程机器的堆转储(我正在使用visual vm 1.3.8)。无法使用jvisualvm或jconsole连接到远程jmx服务器(netcat正在运行)

要解决这一点,我开始了我的有以下额外的选项应用:

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

为了使JConsole的连接:尝试添加该标志

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

,并以堆转储,你不需要通过JConsole的连接,只需使用JMAP:

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

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

+0

我的问题是不同的。我需要在运行Spark的应用程序上运行此操作。 spark-submit命令以及jmx选项需要在与应用程序主机相同的机器上完成。否则,该服务将运行,但不会按预期运行。 – Sohaib

0

的问题是,$ HOSTNAME是正在运行的火花从提交服务器的主机名,您需要设置机器的主机名火花驱动程序上运行:

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

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