流式分布式系统Storm安装与部署-单机版

 主要参考的网站资源:
http://my.oschina.net/leejun2005/blog/147607(一篇对照一个例子讲storm原理和应用的不错文章)
http://www.cnblogs.com/XjChenny/p/3214039.html(非常完整的storm安装教程,我主要是参照这篇文章安装的,缺点是文中几乎没有提到遇到的问题,需要自己去查找解决问题的办法)
http://javanlu.github.io/blog/2013/10/11/storm-deploy-tutorial/#storm-starterwordcount(一个github上的博客,有非常全面的storm使用经验指导。)

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

         这篇文章写的有点罗嗦,但是为了尽量把我在安装过程中遇到的困难都描述清楚,为你提供比较详细的参考,我觉得这正是我这篇文章比其它的教程要好的地方,如果你是一个完全没有接触过storm的新手,那相信我,这是我目前见过最好的教程微笑

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

        话不多说,开始吧。

一 , 准备工作

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

  1.1  安装JDK6

        Storm需要JVM的支持,我选择的是Java 1.6。原则上是可以安装JDK7的,但是我开始装的是JDK7,最后编译的工程总是出问题,在网上有种说法是,linux很多应用程序不支持JDK7,我将信将疑的把JDK7卸载了之后重新装成JDK6,确实问题修复了。虽然到现在我还是不大相信是JDK7造成的问题,不过我还是建议你安装JDK6,安装步骤可以参见我另外一篇文章:

http://blog.csdn.net/yumik0/article/details/20074537

        1.2    安装eclipse

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

        (1)下载安装包

         网址是:http://www.eclipse.org/downloads/

         注意根据机器的位数下载不同版本。

         我下载的是:eclipse-standard-kepler-SR1-linux-gtk-x86_64.tar.gz

         (2)如果你的系统是刚装的,那么在根目录下创建opt文件夹:

                                                                  sudo mkdir   /opt

         (3)将eclipse的安装包拷贝到/opt下:

                                                                  sudo  cpeclipse-standard-kepler-SR1-linux-gtk-x86_64.tar.gz  /opt

         (4)解压安装:

                                                                   cd /opt
                                                                   tar -zvxf eclipse-standard-kepler-SR1-linux-gtk-x86_64.tar.gz 

          (5)测试是否成功:

                   进入opt/eclipse文件夹下,打开eclipse,第一次登陆还是要设置workspace,跟windows一样,编写一个helloworld程序试试就知道了,一般是没有问题的。

 二 ,安装zookeeper

          (1)下载安装包

          同学们可以到官网上去下载:http://zookeeper.apache.org/releases.html

          我使用的是目前最新的版本:zookeeper-3.4.5。

          安装非常简单,解压即可:

                                                                     cd /home/bupt/installpack             我存放安装包的地方

                                                                    tar -zvxfzookeeper-3.4.5.tar.gz

          (2)设置环境变量:

                                                                     

                                        sudo vim /etc/profile        

           在后面加上:                                                                   

                            export ZOOKEEPER_HOME=/home/bupt/installpack/zookeeper-3.4.5
                       export PATH=$ZOOKEEPER_HOME/bin:$PATH
               使其生效:

                                                        source /etc/profile

          (3)修改配置文件

           在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文件中有介绍,我就不讲了。你甚至不需要知道意思,照着我的参数配置也可以,等你想了解的时候再回过头来看看。

              (4)配置myid文件

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

          (5)测试

             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文件,并重新创建了同名的空文件,结果就好了。我们得出的结论是status太SB,修改之后需要我们手动的更新zookeeper.out文件,如果你也遇到了这个问题,不妨试试这个方法吧。我真是屡试不爽。

三 , 安装ZeroMQ和JZMQ

         3.1 安装libtool  automake  autoconf  m4

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

              wget http://mirrors.kernel.org/gnu/m4/m4-1.4.13.tar.gz 

的方式安装,我不建议使用这种方法,因为这样安装到的版本比较低,所以我推荐大家到它们的官网上去下载最新的安装包。

        (1)libtool

          下载地址:http://mirrors.ustc.edu.cn/gnu/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
       (2)m4

       下载地址:http://ftp.gnu.org/gnu/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
     (3)automake

      下载地址:http://ftp.gnu.org/gnu/automake/

       我下载的是:automake-1.14.tar.gz       

           tar xzvf automake-1.14.tar.gz
           cd automake-1.14
           ./configure --prefix=/usr/local
           make 
           make install

        (4)autoconf

        下载地址:http://ftp.gnu.org/gnu/autoconf/

        我下载的是:autoconf-2.69.tar.gz   

           tar -xzvf autoconf-2.69.tar.gz
           cd autoconf-2.69
           ./configure --prefix=/usr/local
           make
           make install

      3.2  安装ZeroMQ

       跟上面打安装步骤类似,先是下载安装包,下载地址:http://download.zeromq.org/

       我使用的是最新版本的 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

      下载地址:https://github.com/zeromq/jzmq

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

       unzip 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啦。下载地址:http://storm.incubator.apache.org/downloads.html

        为了方便使用,我使用的是:storm-0.8.2.zip,最新版本的是0.9.1,我第一次装的就是这个版本,但是最后运行storm-starter的时候除了问题,我估计应该是版本兼容的问题,从releases历史上看,storm-0.8.2是0.9.1前一个版本,所以也不算旧,如果大家只是先打算熟悉一下storm的话,不妨安装这个版本,反正安装也不麻烦。到时候重新装一个就可以啦。

        Storm也是解压就能用的:

                    unzip storm-0.8.2.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.8.2/conf

                                         sudo vim storm.yaml

         配置项:                 storm.zookeeper.servers:
                                              - "10.103.12.243"
                                         nimbus.host : "10.103.12.243"
                                         storm.zookeeper.port : 2181
                                         storm.local.dir : "/home/bupt/storm/data"
                                         ui.port : 8080

           必要的说明:

                               1)storm.zookeeper.servers : 指定Storm系统所使用的Zookeeper的地址。如果安装的是单机版,那就是你的本机地址。

                               2)nimbus.host : "10.103.12.243", storm nimbus的IP地址,指定此机器为Storm的Nimbus结点,也是本机地址。

                               3)storm.local.dir :Storm的一些配置文件或jar包,或日志存放的地方,注意这个目录下,一定要保证有权限生成文件,否则会报错,因此最好是本地用户的文件路径。

                              4) 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。

        然后在浏览器中输入: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

         commons-collections-3.2.1-bin.tar.gz 下载地址:http://commons.apache.org/proper/commons-collections/download_collections.cgi

          twitter4j-2.2.6.zip 下载地址:http://ishare.iask.sina.com.cn/f/34337146.html?sudaref=www.google.com.hk&retcode=0

          注意twitter要被墙,说起这个还跟我们校长有关呢,默默的fuck一句,所以大家需要手动下载,网上有好心人提供的,如果使用maven这种自动到twitter官网去下载的工具,很可能不能成功下载,就要坑了。

          storm-starter:  https://github.com/nathanmarz/storm-starter

          这写软件包都是解压即可用。

          5.2 生成jar包

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

          1) 使用eclipse建立java project。追加twitter4j,commons-collections-3.2.1和storm的jar文件。

                       File->New -> Java Project->为项目取名(如我取的是MyStormCase)-> Next
                 ->Libraries -> add External JARs...->
                                 追加twitter4j的jar文件:twitter4j/lib下所有的jar包
                                 追加commons-collections-3.2.1的jar文件 : commons-collections-3.2.1文件夹下所有的jar包。
                                 追加storm的jar文件: /usr/local/storm-0.8.2/lib/下的所有jar包和/usr/local/storm-0.8.2/storm-0.8.2.jar)
                 ->Finsh
如下图:

    


       2)导入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

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

3) 追加源文件 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
这一步类似于上一步。

     最后的工程图如下:


4) 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,这是接下来学习的重点,每天也都会遇到一些不可预知的问题,解决就好了,问题的表单可能会越来越长。
      (1)问题一: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的一个普遍问题,网上讨论得也比较多,但是解决方法却很少,不妨试一试这个办法吧。

     (2)问题二:
      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地址配置没有问题,还是连不上,那就试试关闭防火墙吧。

       (3)问题三: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两个文件夹。

转载链接:http://blog.csdn.net/yumik0/article/details/20717717
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值