背景: 編寫了一個MapReduce程序,發現該程序內存占用非常多,需要有一種方法來分析內存詳細的占用情況。
可以使用linux上的pmap –d <PID>來看進程邏輯地址空間使用情況,但是會有很多anno區域,顯然這不能夠滿足同學們的好奇心。
在這篇文章Eclipse遠程調試HDP源代碼中,提到使用JMX的方法對HDP進行遠程調試。JMX(Java Management Extensions,即Java管理擴展),望文生義一下,可知這個機制是與管理相關的。在這個機制的基礎上,可以對JVM的運行情況進行實時的分析。方法如下:
1. 修改vim /usr/hdp/2.3.0.0-2557/hadoop/etc/hadoop/hadoop-env.sh的配置,添加與JMX相關的參數:
文字版本(添加45行的內容)
42 43 # The following applies to multiple commands (fs, dfs, fsck, distcp etc) 44 export HADOOP_CLIENT_OPTS="-Xmx${HADOOP_HEAPSIZE}m $HADOOP_CLIENT_OPTS" 45 export HADOOP_CLIENT_OPTS="-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremo te.local.only=false -Djava.net.preferIPv4Stack=true -Dcom.sun.management.jmxremote.port=1499 $HADOOP_CLIENT_OPTS "
這個會在執行hadoop jar的機器上,開啟一個端口,這個端口號由-Dcom.sun.management.jmxremote.port=1499這個參數決定。
2.啟動一個mapreduce程序,bash-4.1$ hadoop jar /home/yanliming/workspace/mosaicTest/videoMapreduce/videoMapreduce-1.0-SNAPSHOT.jar /tmp/yanliming/Wildlife.wmv /tmp/ryj/result/output012
在啟動mapreduce的集群上,可以看到剛才配置的端口已經起來:
3. 下載visualVM 地址:http://visualvm.java.net/download.html
在visualVM中,配置遠程機器的IP和端口號,進行實時的監控: