JSTORM 問題排查

## 運行時topology的task列表中報"task is dead"錯誤
有幾個緣由可能致使出現這個錯誤:線程

1. task心跳超時,致使nimbus主動kill這個task所在的worker
2. task對應的 bolt/spout 中的open/prepare/execute/nextTuple等,沒有對異常作try...catch,致使拋出異常,致使task掛掉。**這裏要注意一下,一個worker中任意一個task若是沒有作異常處理,會致使整個worker掛掉,會致使該worker中其餘task也報Task is dead**,因此在jstorm的應用代碼中,**強烈建議在全部的方法中都加上try...catch**。日誌

具體排查能夠這麼來作:orm

1. 若是task是每隔4分鐘左右有規律地掛掉,那麼基本能夠肯定是task心跳超時致使的,能夠直接跳到3
2. 查看worker日誌,在掛掉的時間點是否有異常。可是注意要看掛掉的那個worker的日誌,而不是從新起來以後新的worker的日誌,由於worker從新起來以後可能位於不一樣的機器上。
3. 若是worker日誌沒有異常,那麼能夠看一下集羣nimbus的日誌,搜一下:"Update taskheartbeat",而後找到掛掉的worker所對應的topology Id,看看最後更新心跳的時間是何時。對比一下task心跳超時的配置(nimbus.task.timeout.secs),若是worker掛掉的時間 - 最後一次更新心跳的時間 > task心跳超時,那麼基本上能夠肯定是由於task心跳超時被kill了。這有幾種可能:隊列

* 執行隊列被阻塞了,一直沒有返回;
* worker發生了FGC,這會致使正常的線程都被停住,從而致使心跳超時。這時要查看一下對應的GC日誌,看那個時間點附近有沒有FGC;
* worker/task拋出了未處理的異常,如OutOfMemoryError之類的
* 最後也有多是worker一直沒起來, worker心跳超時集羣

相關文章
相關標籤/搜索