重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
storm问题总结(持续更新)
1. yaml跟我们一般用的属性配置文件有所不同, 它的要求更严格一些, 因此在往conf/storm.yaml中添加配置的时候必须注意.
比如必须注意开始位置和冒号后面的空格, 否则配置不会生效. 关于yaml相关的资料, 网上有很多资料可以参考
如何检查配置是否生效, 可以使用命令: storm localconfvalue 配置关键字
但是这个命令只能在nimbus上生效, 在supervisor看到的还是默认值. 不知道为什么
2. 在部署storm节点的时候需要安装jzmq和0qm, 在安装这两个依赖包之后, 需要执行sudo -u root ldconfig. 否则会出现异常:
2012-02-24 16:30:30 worker [ERROR] Error on initialization of server mk-worker
java.lang.UnsatisfiedLinkError: /usr/local/lib/libjzmq.so.0.0.0: libzmq.so.1: cannot open shared object file: No such file or directory
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1803)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1728)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at org.zeromq.ZMQ.
这里有相关的讨论:
http://groups.google.com/group/storm-user/browse_thread/thread/656fb21d7166574d
3. 关闭nimbus相关进程:
kill `ps aux | egrep '(daemon\.nimbus)|(storm\.ui\.core)' | fgrep -v egrep | awk '{print $2}'`
4. 干掉supervisor上的所有storm进程:
kill `ps aux | fgrep storm | fgrep -v 'fgrep' | awk '{print $2}'`
5. 目前storm貌似不支持动态加载log4j配置文件, 每一个supervisor节点需要修改log4j/storm.log.properties文件来调整日志输出.
发布topologies时,出现不能序列化log4j.Logger的异常
原因是日志系统无法正确支付序列化。
解决方法:使用slf4j代替log4j。
6. 在打包toplogy工程的时候, 如果采用assembly方式, 对于相关的依赖的配置一般要这样:
wiki上说可以用
7. 有时候supervisor的conf/storm.yaml参数设置不合理, 会导致worker无法起来的现象,
比如我碰到的一个例子是. 定义了worker.childopts(给了一个不合理的jvm参数). 结果导致worker反复启动, 而均不成功, 这里的日志信息也不明确, 只是说无法start, 但是没有给更详细的上下文信息.
backtype.storm.daemon.worker mytoplogy-12-1330051497 fdd0effd
-0611-427a-8e23-84fe25047dbd 6701 d7f8354d-9ec0-4272-aa0d-9260f7b0042f
2012-02-24 14:24:27 supervisor [INFO]
a17ff23e-00b2-4e51-9001-74664413d2dd still hasn't started
2012-02-24 14:24:28 supervisor [INFO]
a17ff23e-00b2-4e51-9001-74664413d2dd still hasn't started
2012-02-24 14:24:28 supervisor [INFO]
a17ff23e-00b2-4e51-9001-74664413d2dd still hasn't started
2012-02-24 14:24:29 supervisor [INFO]
a17ff23e-00b2-4e51-9001-74664413d2dd still hasn't started
8. 有问题直接上storm-user搜索相关帖子或者问Storm的作者Nathan Marz. 此人回答问题非常热心. 从提问人的id来看, 貌似中国人在上面问问题的非常多^_^
9. 发布topologies到远程集群时,出现Nimbus host is not set异常
原因是Nimbus没有被正确启动起来,可能是storm.yaml文件没有配置,或者配置有问题。
解决方法:打开storm.yaml文件正确配置:nimbus.host: "xxx.xxx.xxx.xxx",重启nimbus后台程序即可。
在提交topology的时候有时可能出现如下异常:
Exception in thread "main" java.lang.IllegalArgumentException: Nimbus host is not set
at backtype.storm.utils.NimbusClient.
at backtype.storm.utils.NimbusClient.getConfiguredClient(NimbusClient.java:17)
at backtype.storm.StormSubmitter.submitJar(StormSubmitter.java:78)
at backtype.storm.StormSubmitter.submitJar(StormSubmitter.java:71)
at backtype.storm.StormSubmitter.submitTopology(StormSubmitter.java:50)
at com.taobao.kaleidoscope.storm.IcdbTopology.main(IcdbTopology.java:59)
但是启动nimbus是没有问题的, 这个主要以为内conf_dir路径设置不正确, 在bin/storm脚本中需要加上这样一句:
CONF_DIR = STORM_DIR + "/conf"
10. 如何知道一个tuple的来源?
A:tuple.getSourceStramId()
11. 看到淘宝技术沙龙上@爱的马斯特提到storm 0.6.x版本有内存泄露的坑, 而0.7.0这个版本已经解决了, 貌似目前我们这边还没有碰到, 在考虑是否要升级到最新版本?
12. 发布topologies到远程集群时,出现AlreadyAliveException(msg: xxx is already active)异常
原因是提供的topology与已经在运行的topology重名。
解决方法:发布时换一个拓扑名称即可
13. 发布drpc类型的topologies到远程集群时,出现空指针异常,连接drpc服务器失败
原因是未正确配置drpc服务器地址。
解决方法:在conf/storm.yaml文件中增加drpc服务器配置,启动配置文件中指定的所有drpc服务。内容如下:
drpc.servers:
- "drpc服务器ip"
13. 客户端调用drpc服务时,worker的日志中出现Failing message,而bolt都未收到数据
错误日志如下所示:
2011-12-02 09:59:16 task [INFO] Failing message backtype.storm.drpc.DRPCSpout$DRPCMessageId@3770bdf7: source: 1:27, stream: 1, id: {-5919451531315711689=-5919451531315711689}, [foo.com/blog/1, {"port":3772,"id":"5","host":"10.0.0.24"}]
解决方法:主机名,域名,hosts文件配置不正确会引起这类错误。
检查并修改storm相关机器的主机名,域名,hosts文件。重启网络服务:service network restart。重启storm,再次调用drpc服务,成功。
Hosts文件中必须包含如下内容:
[nimbus主机ip] [nimbus主机名] [nimbus主机别名]
[supervisor主机ip] [supervisor主机名] [supervisor主机别名]
[zookeeper主机ip] [zookeeper主机名] [zookeeper主机别名]
14. bolt在处理消息时,worker的日志中出现Failing message
原因可能是因为Topology的消息处理超时所致。
解决方法:提交Topology时设置适当的消息超时时间,比默认消息超时时间(30秒)更长。
conf.setMessageTimeoutSecs(60);
15. storm启动时报no jzmq in java.library.path错误
原因是找不到jzmq,默认情况下在执行install_zmq.sh时,那些.so文件安装路径在/usr/local/lib,但是实际安装时可能装在其他的路径下了。
解决方法:在storm.yaml中添加:
java.library.path: "/opt/storm/jzmq/lib:/opt/storm/zeromq/lib:/usr/local/lib:/opt/local/lib:/usr/lib"
16. 安装jzmq时遇到No rule to make target `classdist_noinst.stamp'的make错误
具体的make错误信息:
make[1]: *** No rule to make target `classdist_noinst.stamp',
needed by `org/zeromq/ZMQ.class'. Stop.
解决方法:手动创建classdist_noinst.stamp空文件。
touch src/classdist_noinst.stamp
17. 安装jzmq时遇到cannot access org.zeromq.ZMQ的make错误
具体的make错误信息:
error: cannot access org.zeromq.ZMQ
class file for org.zeromq.ZMQ not found
javadoc: error - Class org.zeromq.ZMQ not found.
解决方法:手动编译,然后重新make即可通过。
cd src
javac -d . org/zeromq/*.java
cd ..
创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站设计、成都网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的那坡网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!