2016-02-29 66 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> 

順便說一句,這是當你的火花應用程序和火花提交在同一臺服務器上時,它僅適用於你的原因。