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心跳超时集群

相关文章
相关标签/搜索