Storm Supervisor报‘kill: sending signal to PID失败: No such process’问题求助
好的,咱们来一步步拆解这个问题——毕竟本地跑没问题、集群部署就出状况,大概率是集群环境和本地的差异导致的。先从你遇到的kill: sending signal to XXXX failed: No such process报错入手,这个错误通常意味着Supervisor尝试管理的worker进程已经意外退出了,咱们顺着这个线索往下查:
第一步:深挖Worker进程退出的核心日志
Supervisor的报错只是表面现象,真正的故障原因藏在worker的日志里。Storm的worker日志默认存放在$STORM_HOME/logs/workers-artifacts/[拓扑ID]/[端口号]目录下,找到对应拓扑的日志文件后,重点排查这几类信息:
- 未捕获的异常:比如代码里有没有依赖本地环境的硬编码(比如本地文件路径、localhost地址),到集群里无法访问导致崩溃
- 资源不足报错:如果出现
OutOfMemoryError,说明worker内存分配不够,得调整拓扑的内存参数 - OpenTSDB连接日志:看看有没有连接超时、认证失败的提示,集群机器和OpenTSDB的网络连通性可能和本地不一样
第二步:检查Storm集群的配置一致性
本地模式用的是默认配置,集群模式下配置不一致很容易出问题:
- 核对Nimbus和所有Supervisor节点的
storm.yaml,确保storm.zookeeper.servers、nimbus.seeds、storm.local.dir这些核心配置完全一致,有没有节点漏配或者写错? - 检查
supervisor.slots.ports配置的端口是否被其他进程占用,用netstat -tulpn | grep [端口号]验证,如果端口被抢,worker启动会直接失败 - 确认
storm.local.dir目录的权限,Storm运行用户(比如storm用户)必须有读写权限,否则拓扑的jar包和临时文件无法正常加载
第三步:对比本地与集群的拓扑提交参数
本地模式和集群模式提交拓扑的参数可能存在差异:
- 检查拓扑代码里的OpenTSDB地址是不是硬编码成了
localhost,到集群里得改成所有节点都能访问的地址 - 提交拓扑时,试试指定足够的worker内存和数量,比如:
storm jar storm-opentsdb-2.0.0-SNAPSHOT.jar your.topology.Class -c topology.worker.memory.mb=2048 -c topology.workers=2 - 开启debug日志重新提交,能拿到更详细的运行信息:
storm jar storm-opentsdb-2.0.0-SNAPSHOT.jar your.topology.Class -c topology.debug=true
第四步:排查系统级别的隐性问题
有时候故障根源不在Storm本身,而是操作系统层面:
- 查看Supervisor节点的系统日志(比如
/var/log/messages或dmesg),有没有OOM Killer杀掉Storm worker的记录?如果系统内存不足,操作系统会主动终止占用内存大的进程,导致worker突然消失 - 测试集群节点与OpenTSDB的网络连通性,在Supervisor节点上执行
telnet [OpenTSDB主机] 4242或curl http://[OpenTSDB主机]:4242/api/version,确认端口是否开放
另外,你可以把本地环境的Java版本、依赖包版本和集群做个对比,很多兼容性问题都是这么来的。
内容的提问来源于stack exchange,提问作者Sanjay Awasthi
相关产品推荐
相关产品推荐

