Storm单机版的安装与部署

经过一周多的努力,我的storm安装折腾之路终于在这个寒冷的周五结束了,觉得一定要写下来,一则为了即将开始的Storm集群部署保留一手资料,二来也为了给更多没接触过但需要使用Storm的同学提供点指导。网上虽然有很多关于storm的安装教程,但我觉得有两个方面的不足,一是作者默认你已经有了不错的linux,分布式架构,github开源项目的经验,所以有些地方点到即止,让新手好不恼火。另一方面,很少提到遇到的问题,但是,相信我,安装不是困难的,难的是你即将遇到一些你百思不得其解的问题,对于新手来说同样是极其影响心情和士气的,幸好有立鑫学长的倾情指导,为我解决了一个个难题,鞠躬。

这篇文章写的有点罗嗦,但是为了尽量把我在安装过程中遇到的困难都描述清楚,为你提供比较详细的参考,即使你是一个完全没有接触过storm的新手,甚至刚接触linux不久,我相信你也能通过这篇教程搭出一个storm系统。

另外,注意一下,这个教程描述的是单机版的storm,集群版我后面再写,两者配置是不一样的。话不多说,开始吧。

准备工作

我的机器是Ubuntu 12.04,虽然storm可以在windows下部署,但是我不建议你么做,我同样建议你安装一个全新的系统,以防止各种各种别的问题。

1.1 安装JDK6

Storm需要JVM的支持,我选择的是Java1.6,只要是Java1.6以上版本就可以。不过我还是建议你安装JDK6,安装步骤非常简单,我就不赘述了,网上也有很多教程。简单的说就是就是下载安装包,解压到安装路径,如/usr/lib/jvm,修改/etc/profilesource /etc/profile

1.2 安装Eclipse

storm的Topology需要被打成jar包上传,可以使用lein,maven等,不过我建议使用eclipse,因为这个大家可能更熟悉一点,最后我也会以eclipse为例子演示怎么制作storm的jar包。

  • 下载安装包

    这是下载地址

    注意根据机器的位数下载不同版本。我下载的是:eclipse-standard-kepler-SR1-linux-gtk-x86_64.tar.gz - 如果你的系统是刚装的,那么在根目录下创建opt文件夹:

sudo mkdir   /opt
  • 将eclipse的安装包拷贝到/opt下:
sudo  cpeclipse-standard-kepler-SR1-linux-gtk-x86_64.tar.gz  /opt
  • 解压安装:
cd /opt
tar -zvxf eclipse-standard-kepler-SR1-linux-gtk-x86_64.tar.gz
  • 测试是否成功: 进入opt/eclipse文件夹下,打开eclipse,第一次登陆还是要设置workspace,跟windows一样,编写一个helloworld程序试试就知道了,一般是没有问题的。

安装zookeeper

  • 下载安装包 同学们可以到官网上去下载.我使用的是目前最新的版本:zookeeper-3.4.5。安装非常简单,解压即可:
cd /home/bupt/installpack             我存放安装包的地方
tar -zvxfzookeeper-3.4.5.tar.gz
  • 设置环境变量:
sudo vim /etc/profile 

在后面加上:

export ZOOKEEPER_HOME=/home/bupt/installpack/zookeeper-3.4.5
export PATH=$ZOOKEEPER_HOME/bin:$PATH

使其生效:

source /etc/profile
  • 修改配置文件 在zookeeper-3.4.5/conf文件下有一个叫zoo_sample.cfg的文件,它是zookeeper配置文件的模版,复制它,并改名为zoo.cfg,打开,修改配置如下:
tickTime=2000  
dataDir=/home/bupt/installpack/zookeeper-3.4.5/zkdata  这里zkdata是我自己造的
clientPort=2181  
initLimit=5  
syncLimit=2 
server.1=10.103.12.243:2888:3888 

一点说明 :server.1=10.103.12.243:2888:3888中的IP地址是我本机的地址,你配置的时候要改成你的机器的地址。 上述参数的解释在zoo.cfg文件中有介绍,我就不讲了。你甚至不需要知道意思,照着我的参数配置也可以,等你想了解的时候再回过头来看看。

  • 配置myid文件 在dataDir目录下新建myid文件,打开并写入id号,id号即为zoo.cfg文件中server.后的数字, 如server.1=IP1:2888:3888即表示IP1机器中的myid号为1。

  • 测试

cd /home/bupt/installpack/zookeeper-3.4.5/bin
sh zkServer.sh start

正常情况下会提示:

JMX enabled by default
Using config: /home/bupt/installpack/zookeeper-3.4.5/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

查看状态,执行:

sh zkServer.sh status

如果正常会显示:

JMX enabled by default
Using config: /home/bupt/installpack/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: standalone

这里的standalone是因为我安装的是单机版。如果是集群的话,应该是leader或者follower。 至此,zookeeper就安装完了。 不过我曾经遇到过一个神奇的问题:当我运行完start之后,显示 STARTED,但是运行status之后,显示如下:

JMX enabled bydefault
Using config: /hadoop/zookeeper/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.

我相信你很可能已经遇到这个问题,相信你同样发现网上的说法都是nc命令的版本问题,解决方法是:用文本编辑器打开zkServer.sh,找到

STAT=`echo stat | nc -q l  localhost $(grep clientPort "$ZOOCFG" | sed -e 's/.*=//') 2> /dev/null| grep Mode`

这行,去掉-q 1 即可,或者,如果缺少-q 1,则加上即可,但是我的zkServer.sh问价压根儿就没有这一行,我猜测这应该zookeeper 早期版本的问题,我使用的zookeeper3.4.5已经修改过zkServer.sh文件了。无奈,只好找别的方法。这里教大家一个好的办法,就是去zookeeper.out文件中去察看日志,里面会记录status失败的原因,例如,我的就是:

“无法打开java命令 usr/lib/jvm/jdk目录不存在”

原来是由于我卸载JDK7,重装成JDK6造成的,jdk文件夹确实已经不存在了。于是我修改环境变量,各种设置,凡是涉及到JDK的地方统统修改路径,这也给大家提个醒,尽量不要在机器上装太多JDK,否则容易乱,卸载的时候也要卸载干净,记得修改环境变量等,造成不必要的麻烦。 事情还没完,等我修改了所有我认为应该修改的设置之后,依然是

Error contacting service. It is probably not running.

我已经抓狂了,剧情当然发展到有大神来指导啦,师兄看了半天也不知道怎么回事,觉得所有的地方都对,但zookeeper.out 文件里总是显示:“无法打开java命令 usr/lib/jvm/jdk目录不存在”。于是他索性删除了zookeeper.out文件,并重新创建了同名的空文件,结果就好了。我们得出的结论是Zookeeper 的status命令太SB,经常出一些莫名其妙的bug,需要我们手动的更新zookeeper.out文件,如果你也遇到了这个问题,不妨试试这个方法吧。我真是屡试不爽。

安装ZeroMQ和JZMQ

3.1 安装libtool automake autoconf m4

在安装这两个组件之前,我强烈建议你检查一下你是否已经安装了上面这写组件,因为他们会在安装ZeroMQ和JZMQ时用到,如果你不想在后续安装的时候频繁的被打断,那就索性先一股脑的安装了吧。

  • libtool

    这是下载地址。我使用的是libtool-2.4.2.tar.gz。

tar -xzvf libtool-2.4.2.tar.gz 
cd libtool-2.4.2
./configure --prefix=/usr/local
make 
make install
  • m4 这是下载地址。我下载的是:m4-1.4.17.tar.gz。
tar -xzvf m4-1.4.17.tar.gz 
cd m4-1.4.17
./configure --prefix=/usr/local
make 
make install
  • automake 这是下载地址。我下载的是:automake-1.14.tar.gz。
tar xzvf automake-1.14.tar.gz
cd automake-1.14
./configure --prefix=/usr/local
make 
make install
`tar -xzvf autoconf-2.69.tar.gz
`cd autoconf-2.69
`./configure --prefix=/usr/local
`make
`make install

3.2 安装ZeroMQ

跟上面的安装步骤类似,先是下载安装包。我使用的是最新版本的 zeromq-4.0.3.tar.gz

tar -xzvf zeromq-4.0.3.tar.gz  
cd zeromq-4.0.3
./autogen.sh
./configure  
make  
sudo make install  

3.3 安装JZMQ

这是下载地址。直接下载.zip文件就可以了。我使用的是jzmq-master.zip。

unzip jzmq-master.zip
cd jzmq-master
./autogen.sh
./configure  
make  
sudo make install  

注意,在安装ZREOMQ 或者JZMQ的过程中,你很可能会遇到:

没有规则可以创建“org/zeromq/ZMQ.class”需要的目标“classdist_noinst.stamp”

这个奇怪的错误,这时你就直接到src文件夹下去手动创建classdist_noinst.stamp文件:

touch src/classdist_noinst.stamp  

你可能还会遇到类似的问题:

*** 没有规则可以创建“XXOO”需要的目标“xxoo

解决方法是类似的。就是手动去创建一个就可以啦。

安装Storm

4.1下载安装:

到目前为止,终于开始安装storm啦。下载地址.我使用的是最新版本的storm-0.9.1。Storm也是解压就能用的:

unzip storm-0.9.1.zip
sudo mv storm-0.8.2 /usr/local/

4.2 修改环境变量:

sudo vim /etc/profile
export STORM_HOME=/usr/local/storm-0.8.2
export PATH=$PATH:$STORM_HOME/bin

4.3 修改配置文件:

配置storm/conf/storm.yaml文件:

cd /usr/local/storm-0.9.1/conf
sudo vim storm.yaml

配置项:

storm.zookeeper.servers: - "10.103.15.85" nimbus.host : "10.103.15.85" storm.zookeeper.port : 2181 storm.local.dir : "/home/bupt/storm/data" ui.port : 8080 supervisor.slots.ports: - 6700 - 6701 - 6702 - 6703 - 必要的说明:

  • storm.zookeeper.servers : 指定Storm系统所使用的Zookeeper的地址。如果安装的是单机版,那就是你的本机地址。
  • nimbus.host : "10.103.12.243", storm nimbus的IP地址,指定此机器为Storm的Nimbus结点,也是本机地址。
  • storm.local.dir :Storm的一些配置文件或jar包,或日志存放的地方,注意这个目录下,一定要保证有权限生成文件,否则会报错,因此最好是本地用户的文件路径。
  • storm.zookeeper.port :zookeeper 与storm通信的 端 口,通常默认为2181。但是最好还是检查一下zookeeper的zoo .cfg文件,保证配置相同。

网上不少同学说,storm.yaml文件的格式很重要,行首与冒号后面都要空一格,否则文件会无法识别。我没有证实是不是必须如此,虽然我不是,不过我还是建议你就这样吧。

4.4 测试storm

cd /home/bupt/installpack/zookeeper-3.4.5/bin
sh zkServer.sh start
cd /usr/local/storm-0.8.2
sudo bin/storm nimbus
sudo bin/storm supervisor
sudo bin/storm ui 

注意要先运行zkServer.sh start。然后在浏览器中输入:http://localhost:8080/ 如上图,则你已经成功安装了storm了。

运行storm-starter中的WordCount

storm-starter是storm提供的官方例子,我使用的是里面的WordCountTopology。

5.1 准备工作

运行这个例子需要如下文件:commons-collections-3.2.1-bin.tar.gz ,twitter4j-2.2.6.zip,storm-starter.

注意twitter要被墙,说起这个还跟我们校长有关呢,默默的不爽一下,由此可见翻墙是多么必要的一项技能。大家需要手动下载,网上有好心人提供的,如果使用maven这种自动到twitter官网去下载的工具,很可能不能成功下载,就要坑了。

5.2 生成jar包

官方文档里介绍了两种方法来生成jar包:lein,maven,我对这两种方法不是很熟悉,选择了用eclipse来代替,在这里也推荐大家使用,毕竟eclipse大家都会用,效果也一样,非常简单。

  • 使用eclipse建立java project。

    追加twitter4j,commons-collections-3.2.1和storm的jar文件。

File->New -> Java Project->为项目取名(如我取的是MyStormCase-> Next->Libraries -> add External JARs...->

- 追加twitter4jjar文件:twitter4j/lib下所有的jar
- 追加commons-collections-3.2.1jar文件:commons-collections-3.2.1文件夹下所有的jar包。
- 追加stormjar文件:/usr/local/storm-0.8.2/lib/下的所有jar包和/usr/local/storm-0.8.2/storm-0.8.2.jar
->Finsh

如下图:

  • 导入storm-start
右键点击工程MyStormCase ->Import -> General -> File System-> Next -> Browse(From directory)-> /home/bupt/installpack/storm-start/src/jvm/storm
并且在“Create top-levelfolder”前打勾 -> Finish

如下图。

完成后,将storm文件夹托拽到src目录下,工程视图如下: 特别注意:分别删除两个文件:

storm.starter下的: PrintSampleStream.java storm.starter.spout下的:TwitterSampleSpout.java

否则最后导出的时候会出错。

  • 追加源文件storm-start/multilang/resources×(python 文件wordcount用)
File -> Import-> General -> File System-> Next -> Browse(From directory)->/home/bupt/installpack/storm-start/multilang/resources
并且在“Create top-levelfolder”前打勾 -> Finish

这一步类似于上一步。最后的工程图如下:

  • JAR export

    File -> Export-> JAR -> JAR file ->取消 “.classpath” ,“.project” 和 “<.settings”->的勾 browse ->你要保存的路径/保存的名字.jar -> next-> next ->点击main class右边的browse键,选择你要运行的例子。然后点击finish。这时候可能会有一些warning,忽略就好了。

5.3 编译jar包:

sudo mv StormStarterOne.jar /usr/local/storm-0.8.2           
cd /home/bupt/installpack/zookeeper-3.4.5/bin
sh zkServer.sh start
cd /usr/local/storm-0.8.2
sudo bin/storm nimbus
sudo bin/storm supervisor
sudo bin/storm ui 
sudo bin/storm jar StormStarterOne.jar storm.starter.WordCountTopology test1 

然后在浏览器中输入localhost:8080,显示如下,则说明运行成功了。

使用中遇到的问题:

到目前为止,我们成功运行了一些官方提供的例子,但是还不太熟悉storm的内部机制,尤其是怎么写一个自己的topology,这是接下来学习的重点,每天也都会遇到一些不可预知的问题,解决就好了,问题的表单可能会越来越长。

  • 问题一:supervisor kill: No such process 跑了一下storm-starter这个例子,最开始的时候是成功了。后来重新运行了一下WordCountTopology这个例子。在启动supervisor这一步失败了,在终端中会不停的出现错误:
kill: No such process
kill: No such process
kill: No such process

我检查了logs,主要的有用的log如下:

2014-03-11 09:45:09 supervisor [INFO] 16b6673f-31d1-4f58-b41c-e88cd8974ddc still hasn't started 2014-03-11 09:45:46 supervisor [INFO] Shutting down and clearing state for id 4ee29ce1-1f75-47ee-8aaa-e0a8ea513537. Current supervisor time: 1394502346. State: :timed-out, Heartbeat: 2014-03-11 09:45:46 supervisor [INFO] Shutting down f2ed3b8d-3a23-4c23-9c3c-af94a06cbad9:4ee29ce1-1f75-47ee-8aaa-e0a8ea513537 2014-03-11 09:45:46 util [INFO] Error when trying to kill 2981. Process is probably already dead.

我在stackoverflow上问过别人,有提到说是进程假死造成的,但是具体怎么做没人说,看了storm的官方文档, 说这个问题好像是0.8.2版本的一个bug。我重装成0.9.1,问题确实也解决了,虽然我不太确定是版本原因造成的。这个问题是storm的一个普遍问题,网上讨论得也比较多,但是解决方法却很少,不妨试一试这个办法吧。

  • 问题二:

    Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect java.net.NoRouteToHostException: No route to host

    刚刚修改了这个bug,没找到bug信息,不想再修改回去重现bug啦。问题的原因是实验室的ip地址难道是变化的吗?上个星期还是10.103.10.243,刚刚才发现是10.103.15.85,导致了连结失败。如果你发现一堆java.lang.connect exception之类的信息,就察看一下你的ip地址和zookeeper,storm的配置文件中的地址是否一致,否则肯定会造成链接问题。网上也有同学说,可能是防火墙的问题,我没有遇到这个问题,如果ip地址配置没有问题,还是连不上,那就试试关闭防火墙吧。

  • 问题三:storm启动supervisor错误 当我运行sudo bin/storm supervisor启动supervisor的时候,发现启动失败,看/log文件夹下的supervisor.log文件,是如下的出错信息:

    2014-03-24 14:19:55 b.s.d.supervisor [INFO] Starting supervisor with id f2ed3b8d-3a23-4c23-9c3c-af94a06cbad9 at host bupt-Shangqi-N720 2014-03-24 14:19:56 b.s.event [ERROR] Error when processing event java.lang.RuntimeException: java.io.EOFException

解决办法是这样的:

删除storm配置文件中storm.local.dir(你在stom.yaml文件中配置的)所指向的目录中的supervisor和workers两个文件夹。

暂时想到这么多,enjoy,同学们.

主要参考的网站资源:

一篇对照一个例子讲storm原理和应用的不错文章

非常完整的storm安装教程,我主要是参照这篇文章安装的,缺点是文中几乎没有提到遇到的问题,需要自己去查找解决问题的办法

一个github上的博客,有非常全面的storm使用经验指导

Comments !