分享

storm常见问题解答及错误解决汇总

pig2 发表于 2014-3-13 01:20:55 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 3 12972
本帖最后由 pig2 于 2014-3-13 01:24 编辑

对于下面内容,我们首先解决的一个问题:什么是OOM,其代内存溢出的意思。
Storm计算后的结果,保存在内存还是其他位置?
storm是否提供供机制来动态调整worker和task数目?
发布topologies时,出现不能序列化log4j.Logger的异常该如何解决?


已有(3)人评论

跳转到指定楼层
pig2 发表于 2014-3-13 01:21:09
本帖最后由 pig2 于 2014-3-13 01:23 编辑
一、我有一个数据文件,或者我有一个系统里面有数据,怎么导入storm做计算?

你需要实现一个Spout,Spout负责将数据emit到storm系统里,交给bolts计算。怎么实现spout可以参考官方的kestrel spout实现:
https://github.com/nathanmarz/storm-kestrel

如果你的数据源不支持事务性消费,那么就无法得到storm提供的可靠处理的保证,也没必要实现ISpout接口中的ack和fail方法。

二、Storm为了保证tuple的可靠处理,需要保存tuple信息,这会不会导致内存OOM?

Storm为了保证tuple的可靠处理,acker会保存该节点创建的tuple id的xor值,这称为ack value,那么每ack一次,就将tuple id和ack value做异或(xor)。当所有产生的tuple都被ack的时候, ack value一定为0。这是个很简单的策略,对于每一个tuple也只要占用约20个字节的内存。对于100万tuple,也才20M左右。关于可靠处理看这个:
https://github.com/nathanmarz/st ... -message-processing

三、Storm计算后的结果保存在哪里?可以保存在外部存储吗?

Storm不处理计算结果的保存,这是应用代码需要负责的事情,如果数据不大,你可以简单地保存在内存里,也可以每次都更新数据库,也可以采用NoSQL存储。storm并没有像s4那样提供一个Persist API,根据时间或者容量来做存储输出。这部分事情完全交给用户。

数据存储之后的展现,也是你需要自己处理的,storm UI只提供对topology的监控和统计。

四、Storm怎么处理重复的tuple?

因为Storm要保证tuple的可靠处理,当tuple处理失败或者超时的时候,spout会fail并重新发送该tuple,那么就会有tuple重复计算的问题。这个问题是很难解决的,storm也没有提供机制帮助你解决。一些可行的策略:
(1)不处理,这也算是种策略。因为实时计算通常并不要求很高的精确度,后续的批处理计算会更正实时计算的误差。
(2)使用第三方集中存储来过滤,比如利用mysql,memcached或者redis根据逻辑主键来去重。
(3)使用bloom filter做过滤,简单高效。

五、Storm的动态增删节点

我在storm和s4里比较里谈到的动态增删节点,是指storm可以动态地添加和减少supervisor节点。对于减少节点来说,被移除的supervisor上的worker会被nimbus重新负载均衡到其他supervisor节点上。在storm 0.6.1以前的版本,增加supervisor节点不会影响现有的topology,也就是现有的topology不会重新负载均衡到新的节点上,在扩展集群的时候很不方便,需要重新提交topology。因此我在storm的邮件列表里提了这个问题,storm的开发者nathanmarz创建了一个issue 54并在0.6.1提供了rebalance命令来让正在运行的topology重新负载均衡,具体见:
https://github.com/nathanmarz/storm/issues/54
和0.6.1的变更:
http://groups.google.com/group/s ... ad/24a8fce0b2e53246

storm并不提供机制来动态调整worker和task数目。

六、Storm UI里spout统计的complete latency的具体含义是什么?为什么emit的数目会是acked的两倍?
Storm作者marz的解答:
The complete latency is the time from the spout emitting a tuple to that
tuple being acked on the spout. So it tracks the time for the whole tuple
tree to be processed.

If you dive into the spout component in the UI, you'll see that a lot of
the emitted/transferred is on the __ack* stream. This is the spout
communicating with the ackers which take care of tracking the tuple trees.

简单地说,complete latency表示了tuple从emit到被acked经过的时间,可以认为是tuple以及该tuple的后续子孙(形成一棵树)整个处理时间。其次spout的emit和transfered还统计了spout和acker之间内部的通信信息,比如对于可靠处理的spout来说,会在emit的时候同时发送一个_ack_init给acker,记录tuple id到task id的映射,以便ack的时候能找到正确的acker task。


---------------------------------------------------------------------------------------------------------------------------------------------------

七、 发布topologies到远程集群时,出现Nimbus host is not set异常

原因是Nimbus没有被正确启动起来,可能是storm.yaml文件没有配置,或者配置有问题。

解决方法:打开storm.yaml文件正确配置:nimbus.host: "xxx.xxx.xxx.xxx",重启nimbus后台程序即可。

八、发布topologies到远程集群时,出现AlreadyAliveException(msg: xxx is already active)异常

原因是提供的topology与已经在运行的topology重名。

解决方法:发布时换一个拓扑名称即可。

九、启动Supervisor时,出现java.lang.UnsatisfiedLinkError: /usr/local/lib/libjzmq.so.0.0.0: libzmq.so.1: cannot open shared object file: No such file or directory异常

原因是未找到zmq动态链接库。

解决方法1:export LD_LIBRARY_PATH=/usr/local/lib

解决方法2:编辑/etc/ld.so.conf文件,增加一行:/usr/local/lib。再执行sudo ldconfig命令,重启Supervisor。

十、发布drpc类型的topologies到远程集群时,出现空指针异常,连接drpc服务器失败

原因是未正确配置drpc服务器地址。

解决方法:在conf/storm.yaml文件中增加drpc服务器配置,启动配置文件中指定的所有drpc服务。内容如下:

drpc.servers:

  - "drpc服务器ip"

十一、 客户端调用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主机别名]

十二、 发布topologies时,出现不能序列化log4j.Logger的异常

原因是日志系统无法正确支付序列化。

解决方法:使用slf4j代替log4j。

十三、 bolt在处理消息时,worker的日志中出现Failing message

原因可能是因为Topology的消息处理超时所致。

解决方法:提交Topology时设置适当的消息超时时间,比默认消息超时时间(30秒)更长。

conf.setMessageTimeoutSecs(60);

十四、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"

十五、安装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

十六、 安装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 ..



回复

使用道具 举报

chencheng06 发表于 2014-5-25 19:34:34
哎 没有验证的copy
回复

使用道具 举报

muyannian 发表于 2014-12-31 17:05:02

楼上,你觉得那里有问题。可以说出来,大家一起讨论。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条