Hadoop中的問題排查思路

1、概述:

在實際使用hadoop的過程當中,因爲涉及到多臺服務器、每臺機器上可能還有多個服務等。因此當集羣環境出現問題時,快速定位到錯誤出現的地方尤其重要。java

在排查錯誤的過程當中,基本上就是經過既有的工具來檢測集羣的運行時環境、集羣日誌等來分析致使錯誤的緣由。node

2、Java heap:

hadoop須要運行在Java運行時環境之上。所以jvm中的內存分配是否處於合理的狀態,就是須要檢測的一個因素。Java虛擬機中分爲多個區域,最值得關注的區域是heap區。heap區的大致劃分以下:ios

image

建立對象時,會首先在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

image

3、經過瀏覽器界面查看:

hadoop集羣中提供了不少基於web服務的界面。併發

namenode管理界面:http://hostname:50057jvm

image

ResourceManager管理界面:http://hostname:8088

image

JobTracker管理界面(hadoop1.x):http://hostname:50030

4、查看日誌:

經過tar包安裝的hadoop日誌通常位於<hadoop_home>/logs目錄下。

image

經過cdh安裝的hadoop日誌通常位於/var/log/hadoop目錄下。

log的級別設置:在hadoop-daemon.sh中定義:

image

5、在線分析工具:

一、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,能夠經過瀏覽器查看統計數據。

image

image

image

三、fsck檢查文件系統是否有損壞的blocks。

四、使用dfsadmin命令。

6、其餘工具:

一、strace:這是一個Linux工具。

二、iostat:查看磁盤是否出現瓶頸。

三、nload:監控當前的網絡帶寬。

四、iptraf。

五、netstat:查看端口占用。

六、tcpdump:抓包工具。示例以下:

tcpdump -nn -i etho -xX -s 0 tcp and port 2181
相關文章
相關標籤/搜索