昨天搭建好集群,提交了topology,但是始终没有结果。今天debug一天终于解决了,记录下来。
问题描述:##
- ui显示topology在运行,但是emit, uptime等数据始终为0。
- jps没有发现worker进程,看 supervisor.log 和 worker-*.log,发现supervisor一直在启动worker进程, 但是worker马上就死了
- 工作目录不停产生hs_err_pidXXX.log日志。
解决过程:
-
开始怀疑代码有问题,在本地模式下调试,确实发现问题,但是解决完问题成功在本地运行后,在集群上还是一样
-
看到很多hs_err_pidXXX.log,在网上查了下是jvm崩溃了,因为对java了解不深,以为是java版本问题(集群机器上有1.6 1.7 两个版本)。于是将集群的机器都改成 1.6。结果还是有问题
-
反复看各种storm日志,google, 改代码,重新跑topology, 重启集群,以root身份启动集群....... 结果都失败了
-
回头找了下介绍hs_err_pidXXX.log,定位了问题(不能确定)
从文件头部信息看来,是 libzmq这个库的问题。运维安装的是最新稳定版的zeromq 和 jzmq。 在两者兼容性问题上纠结了半天,网上查了很多博客资料,依旧搞不出个所以然。
-
无意中看到storm出 0.9 了,想着是不是zeromq和jzmq太新了(刚release几天), 而用的storm-0.8.1是12年release的,不兼容。抱着换0.9的想法,去找了下0.9的release log 。 结果!卧槽
尼玛,好大一个坑啊!!!
-
重新编译了 zeromq-2.1.7, 成功运行topology
注: 其实storm/bin里面有个脚本install_zmq.sh, 使用这个脚本安装就可以了。jzmq也使用脚本里的冻结的源码,使用最新的源码也会有出现上面说的问题!
总结:
storm 文档好少,实例好少,问题及解决好少,得靠自己多摸索啊