博客公告:(1)本博客所有博客文章搬迁至《博客虫》http://www.blogchong.com/
(2)文章对应的源码下载链接参考博客虫网站首页的“代码GIT”直通车;
(3)更多的相关文章更新,以及代码等,请关注博客虫网站,网站中有技术Q群,以及代码共享链接。
http://blog.sina.com.cn/s/blog_8c243ea30101iu1x.html
目录
2.1 IRichBolt与IBasicBolt接口区别... 2
1 文档说明
写该文档的起因是有个朋友整理了一些Storm相关的问题问我,我想刚好可以把这些问题收集下,整理成文档,更方便大家参考,另外根据群中的一些朋友的问题也收集进去了。总体来说是比较基础的东西,希望对大家有用。此外,如果相关问题解决或者有其他问题的地方,希望大家提出来。
2 相关问题整理
2.1 IRichBolt与IBasicBolt接口区别
首先从类组成上进行分析可以看到,IBasicBolt接口只有execute方法和declareOutputFields方法,而IRichBolt接口上除了以上几个方法还有prepare方法和cleanup及Map方法。而且其中execute方法是有些不一样的,其参数列表不同。
总体来说Rich方法比较晚上,我们可以使用prepare方法进行该Bolt类的初始化工作,例如我们链接数据库时,需要进行一次数据库连接操作,我们就可以把该操作放入prepare中,只需要执行一次就可以了。而cleanup方法能在该类调用结束时进行收尾工作,往往在处理数据的时候用到,例如在写hdfs(hadoop的文件系统)数据的时候,在结束时需要进行数据clear,则需要进行数据收尾。当然,根据官网及本人的实验,该方法往往是执行失败的。
2.2 Storm需要安装Zookeper
有个朋友问到:那为什么不可以把zookeeper只安装在nimbus上,然后让其他的supervisor来它这里读取任务?如果在每台机器上都有zookeeper,那nimbus分配任务的时候,是每台机器上的zookeeper都收到一模一样的任务,还是只是所有任务的一部分?
这里涉及到一个问题,就是nimbus与supervisor交互的问题,就如以上问到的那样,为什么supervisor不来nimbus上读取数据,问题是如何让他来读取数据?!
这就是设置zk集群的原因所在了,zk集群内部有他自己的一套相互通信机制,而storm正是要借助其通讯机制,例如任务下发什么的,往往在执行一个任务的时候,storm会把任务及相关执行的代码经过序列化之后发送到各个zk节点供supervisor去下载,然后才会各自执行自己部分的代码或者任务。
所以zk集群是必须的。
2.3 关于ack与fail
群里许多朋友会问到关于storm的Spout组件中的ack及fail相关的问题,这里做一个简要的概述。
Storm保证每一个数据都得到有效处理,这是如何保证的呢?正是ack及fail机制确保数据都得到处理的保证,但是storm只是提供我们一个接口,具体的方法得我们自己实现。
例如在spout下一个拓扑节点的bolt上,我们定义某种情况下为数据处理失败,则调用fail,则我们可以在fail方法中进行数据重发,这样就保证了数据都得到了处理。当然我们得加一个处理次数或者是超时处理,不然一条数据会无限重发,那就不好了。
总体来说,一些业务对数据完整处理性要求较高的业务,我们就需要好好的写写ack及fail这两个方法了。
2.4 关于task与executor的关系
群里许多人问道task与executor的关系。这里做一个简单的解释。
在我们配置storm的时候,不知大家是否主要到了一个问题,就是我们在配置的时候会加几个worker的端口(
2.5 安装JDK
在安装好JDK后,有时候需要配置环境变量,这时候我们往往会根据经验修改/etc/profile的值进行环境变量配置,但这在安装JDK时会出问题,安装JDK需要在~/.bashrc文件中加入环境变量,不然java无法使用,本人就遇到过此问题。