storm worker異常重啓原因排查彙總

此時此刻,正在等到6.18的到來,趁着沒事寫個博客,,,酷

 

storm集羣在worker down掉以後會自動啓動新的woker,但是有很多情況下是感覺不應該重啓的時候,woker重啓了,因此就走上了排查woker重啓的道路上~

 

一、排查思路

經過排查,主要總結有以下幾種問題,會導致woker重啓:

1. 代碼有未捕獲的異常

如下例子,因爲處理的數據有異常,並且在代碼中沒有捕獲異常,這樣Exception被拋給了JVM,導致woker down掉。

對於這樣的異常,可以在storm UI界面看到相應的異常信息,因此,排查問題時,可以首先看UI中是否有異常拋出。

 

java.lang.RuntimeException: java.lang.NumberFormatException: For input string: "贈品"
    at backtype.storm.utils.DisruptorQueue.consumeBatchToCursor(DisruptorQueue.java:90)
    at backtype.storm.utils.DisruptorQueue.consumeBatchWhenAvailable(DisruptorQueue.java:61)
    at backtype.storm.disruptor$consume_batch_when_available.invoke(disruptor.clj:62)
    at backtype.storm.daemon.executor$fn__3498$fn__3510$fn__3557.invoke(executor.clj:730)
    at backtype.storm.util$async_loop$fn__444.invoke(util.clj:403)
    at clojure.lang.AFn.run(AFn.java:24)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.NumberFormatException: For input string: "贈品"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    at java.lang.Long.parseLong(Long.java:410)
    at java.lang.Long.parseLong(Long.java:468)
    at com.jd.ad.user.service.impl.UserOrderEntireUpdateServiceImpl.processUserOrderEntireData(UserOrderEntireUpdateServiceImpl.java:96)
    at com.jd.a

 

2、JVM 內存溢出

關於這個問題,沒有保留下來當初的現場,主要是由於各種原因導致JVM的垃圾回收機制有問題,最終導致內存溢出,這個問題,也會導致woker退出。

對於此類異常,跟1中的一樣,也可以在UI界面中看到的,這個需要具體排查JVM內存溢出的原因。

 

3、woker 無問題,supervisor重啓woker

對於1和2中的問題,拋出來的異常信息都可以在UI界面中以及woker的日誌文件中查找到,但是,我們還遇到了另一種情況,就是在woker中找不到任何的異常信息,但是總是隨機的會有woker重啓。

 

因爲woker中找不到異常信息,這時候就需要查看supervisor中的log信息了,因爲supervisor會對本機上的woker中的狀態信息進行監控,並且woker的重啓也是由supervisor操作的。

 

此時,查看supervisor中的日誌信息可以看到以下內容:

2017-06-17 23:36:08 b.s.d.supervisor [INFO] Shutting down and clearing state for id 867ed61b-a9d5-423e-bb0b-b2e428369140. 
Current supervisor time: 1497713767. State: :timed-out, 
Heartbeat: #backtype.storm.daemon.common.WorkerHeartbeat{:time-secs 1497713735, :storm-id "data_process_1-170-1497518898", 
:executors #{[578 578] [868 868] [1158 1158] [1448 1448] [1738 1738] [-1 -1] [288 288]}, :port 6716}

 因此,可以判斷爲是由於supervisor獲取狀態信息timeout超時(其實supervisor是獲取誰的狀態信息,這點還不明確,因爲woker的狀態信息是在本地文件系統中的,難道是獲取executor的狀態?這點希望大家拍磚吐槽),導致把woker shut down 了,然後重啓了woker。並且此時查看機器的狀態,發現zookeeper的機器的CPU負載,會偶爾出現不穩定的狀態。如下圖:

 

 

因此,可以斷定是由於supervisor獲取狀態信息超時導致的。

 

跟運維溝通,zookeeper的3臺機器是跟supervisor部署在同一臺機器上面的,因此會造成機器不穩定的情況出現。

 

平穩度過618,準備回家了。

 


 

 

 

 

 

 

 

發佈了135 篇原創文章 · 獲贊 29 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章