在實際使用hadoop的過程當中,因爲涉及到多臺服務器、每臺機器上可能還有多個服務等。因此當集羣環境出現問題時,快速定位到錯誤出現的地方尤其重要。java
在排查錯誤的過程當中,基本上就是經過既有的工具來檢測集羣的運行時環境、集羣日誌等來分析致使錯誤的緣由。node
hadoop須要運行在Java運行時環境之上。所以jvm中的內存分配是否處於合理的狀態,就是須要檢測的一個因素。Java虛擬機中分爲多個區域,最值得關注的區域是heap區。heap區的大致劃分以下:ios
建立對象時,會首先在Eden區分配內存來建立。隨着時間的推移,Eden會慢慢被填滿,此時就會觸發一次垃圾回收,將Eden區的對象複製到From區。當From區填滿時,則又會觸發一次垃圾回收,從From區複製到To區。web
在複製的過程當中,當某個對象複製的次數達到閾值時,就會從年輕代複製到old區域。vim
在young區域中,垃圾回收器主要是使用ParNew,它是基於複製的垃圾回收器。瀏覽器
在Old區域,可選擇的垃圾回收器有:串行(serialOld),併發(ParallelOld),並行(CMS)等。服務器
可使用下述的命令來查看垃圾回收的相關信息:網絡
[root@node1 ~]# jps 2352 DFSZKFailoverController 2067 NameNode 2456 ResourceManager 2719 Jps [root@node1 ~]# jstat -gcutil 2456 2000 S0 S1 E O P YGC YGCT FGC FGCT GCT 0.00 0.00 25.60 56.20 49.73 10 0.202 1 0.161 0.364 0.00 0.00 25.60 56.20 49.73 10 0.202 1 0.161 0.364 0.00 0.00 25.60 56.20 49.73 10 0.202 1 0.161 0.364 0.00 0.00 25.60 56.20 49.73 10 0.202 1 0.161 0.364 0.00 0.00 25.60 56.20 49.73 10 0.202 1 0.161 0.364
hadoop集羣中提供了不少基於web服務的界面。併發
namenode管理界面:http://hostname:50057jvm
ResourceManager管理界面:http://hostname:8088
JobTracker管理界面(hadoop1.x):http://hostname:50030
經過tar包安裝的hadoop日誌通常位於<hadoop_home>/logs目錄下。
經過cdh安裝的hadoop日誌通常位於/var/log/hadoop目錄下。
log的級別設置:在hadoop-daemon.sh中定義:
一、jstack:用於打印出給定的java進程ID或core file或遠程調試服務的Java堆棧信息。
[root@node1 test]# jps 2352 DFSZKFailoverController 2067 NameNode 2456 ResourceManager 2819 Jps [root@node1 test]# jstack 2456 > rm.dat [root@node1 test]# ls rm.dat [root@node1 test]# vim rm.dat 2016-01-27 16:30:24 Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.79-b02 mixed mode): "Attach Listener" daemon prio=10 tid=0x00007fed089fd000 nid=0xb1b runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE "2141196255@qtp-1207409333-7" daemon prio=10 tid=0x00007fecf4456800 nid=0xab8 in Object.wait() [0x00007fece4c2b000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000000c222d760> (a org.mortbay.thread.QueuedThreadPool$PoolThread) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:626) - locked <0x00000000c222d760> (a org.mortbay.thread.QueuedThreadPool$PoolThread) "ApplicationMaster Launcher" prio=10 tid=0x00007fed090e5000 nid=0xa9e waiting on condition [0x00007fece502f000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00000000c1c1b0e0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043) "rm.dat" 2017L, 144689C
二、jmap+jhat分析:
A、首先用jps或者ps或許須要查詢的進程id。
B、用jmap獲得進程的進行時內存鏡像,命令以下:
jmap -dump:live,format=b,file=jmap.dat ${PID}
C、用jhat進行內存分析:命令以下:
jhat -J-Xmx2G jmap.dat
D、jhat啓動後會創建一個HTTP server,端口爲7000,能夠經過瀏覽器查看統計數據。
三、fsck檢查文件系統是否有損壞的blocks。
四、使用dfsadmin命令。
一、strace:這是一個Linux工具。
二、iostat:查看磁盤是否出現瓶頸。
三、nload:監控當前的網絡帶寬。
四、iptraf。
五、netstat:查看端口占用。
六、tcpdump:抓包工具。示例以下:
tcpdump -nn -i etho -xX -s 0 tcp and port 2181