Storm相关问题整理文档

来源:互联网 发布:speedtime淘宝店怎么样 编辑:程序博客网 时间:2024/06/05 00:34

博客公告:

 (1)本博客所有博客文章搬迁至《博客虫》http://blogchong.com/

                     (2)文章对应的源码下载链接参考博客虫网站首页的“代码GIT”;

                      (3)更多的相关文章更新,以及代码等,请关注博客虫网站,网站中有技术Q群,以及代码共享链接。

                 (4)该博客内容还会继续更新,不过会慢一些。


  该文档为实实在在的原创文档,转载请注明:

http://blog.sina.com.cn/s/blog_8c243ea30101iu1x.html

 

类型

详细

备注

该文档收集了部分Storm相关问题,及其对应解决办法,适合新手或者遇到问题的人参考。该文档将会持续更新。

 

 

相关描述

²  其他相关文档请参考新浪博客http://blog.sina.com.cn/huangchongyuan

²  

²  部分文档涉及到源码,有需要的博客留言

² 欢迎加入storm-分布式-IT技术交流群(191321336,群中有详细的资料),一起讨论技术,一起分享代码,一起分享设计。

 

 

目录

Storm相关问题整理文档... 1

1 文档说明... 2

2 相关问题整理... 2

2.1 IRichBolt与IBasicBolt接口区别... 2

2.2 Storm需要安装Zookeper. 2

2.3 关于ack与fail 2

2.4 关于task与executor的关系... 3

2.5 安装JDK. 3

  

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的端口( supervisor.slots.ports:),比如众多文档中提到的6700/6701等等类似的东西,没错这就是我们定义了该supervisor最多的worker数,worker中执行一个bolt或者spout线程,我们就称之为taks,而executor是物理上的线程概念,而task更多是逻辑概念上的,有时候bolt与spout的task会共用executor,特别是在系统负荷比较高的时候。

 

2.5 安装JDK

 

在安装好JDK后,有时候需要配置环境变量,这时候我们往往会根据经验修改/etc/profile的值进行环境变量配置,但这在安装JDK时会出问题,安装JDK需要在~/.bashrc文件中加入环境变量,不然java无法使用,本人就遇到过此问题。

0 0
原创粉丝点击