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**。

具體排查可以這么來做:

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心跳超時


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM