先简单的把本文要做的事罗列一下:

1. 安装zookeeper集群

2. 安装Storm集群,包括一个Storm的nimbus,在nimbus上启用Storm UI 和两个supervisor

3. 跑一个小例子证实安装完成

 

注:

本例中,nimbus机器IP为10.1.110.24, 两个supervisor分别为10.1.110.21和10.1.110.22。后文不再用通配符写IP。请自行更换IP。

 


准备工作



1. 下载zookeeper3.4.5(如果你比较懒,猛击 这里



2. 下载Storm当前最新0.9.0.1 (猛击 这里



3. 安装被配置好JDK(最低版本1.6)



 



注:



Storm0.9之前的版本,底层通讯用的是ZeroMQ,所以还得去装一个老版本的ZeroMQ(2.1.7,不能装太新的)。



由于ZeroMQ的各种问题,新版支持用Netty替代ZeroMQ。性能上据说能提高两倍。但是默认仍是ZeroMQ,Netty方式需要配置来启用。



github上面安装文档并没有更新,所以,如果要装老版的,可以参考这里:



https://github.com/nathanmarz/storm/wiki/Installing-native-dependencies



新版的release note: http://storm-project.net/2013/12/08/storm090-released.html



 


安装ZK



1. 登陆到10.1.110.21并解压tar包(注意给执行权限)



/var/tmp/zkdata



    1. mkdir -p /var/tmp/zkdata


    3. 建立zk集群的myid文件 (单机版可以跳过该步)



    1. cd /var/tmp/zkdata  
    2. echo 1 > myid


    4. 拷贝zookeeper的conf/zoo_sample.cfg并重命名为zoo.cfg,修改如下:



        

    1. # The number of milliseconds of each tick  
    2. tickTime=2000  
    3. # The number of ticks that the initial   
    4. # synchronization phase can take  
    5. initLimit=10  
    6. # The number of ticks that can pass between   
    7. # sending a request and getting an acknowledgement  
    8. syncLimit=5  
    9. # the directory where the snapshot is stored.  
    10. # do not use /tmp for storage, /tmp here is just   
    11. # example sakes.  
    12. dataDir=/var/tmp/zkdata  
    13. # the port at which the clients will connect  
    14. clientPort=2181  
    15. server.1=10.1.110.21:2888:3888  
    16. server.2=10.1.110.22:2888:3888  
    17. server.3=10.1.110.24:2888:3888  
    18. ## Be sure to read the maintenance section of the   
    19. # administrator guide before turning on autopurge.  
    20. ## http://zookeeper.apache.org/doc/current/zookeeperAdmin.html  
    21. #sc_maintenance  
    22. ## The number of snapshots to retain in dataDir  
    23. #autopurge.snapRetainCount=3  
    24. # Purge task interval in hours  
    25. # Set to "0" to disable auto purge feature  
    26. #autopurge.purgeInterval=1



    dataDir是配置zk的数据目录的



    server.A=B:C:D是集群zk使用的。如果你只想用单个zk,可以不配置。



    A - 是一个数字,表示这是第几号服务器。与/var/tmp/zkdata下的myid文件内容一致



    B - 是该服务器的IP地址



    C - 表示该服务器与集群中的Leader服务器交换信息的端口



    D - 表示如果万一集群中的Leader服务器挂了,需要各服务器重新选举时所用的通讯端口



     



    5.  (Optional)将zk的bin目录路径加入环境变量



    修改/etc/profile文件,在尾部添加如下:


     



      1. #zookeeper  
      2. export ZOOKEEPER=/opt/zookeeper-3.4.5  
      3. PATH=$PATH:$ZOOKEEPER/bin



      6. 启动zk



       

      1. cd /opt/zookeeper-3.4.5/bin  
      2. ./zkServer.sh start


      在剩下两台机器重复以上步骤,注意myid要对应



       


      安装Storm



      1. 解压tar包并赋予执行权限



      2. 将Storm的bin目录加入系统路径



      修改/etc/profile文件,在尾部加入如下:




        1. PATH=$PATH:/opt/storm-0.9.0.1/bin


        使其生效



         




        1. mkdir -p /var/tmp/storm/workdir/


        以上步骤在Storm的集群上的其他机器上重复执行,然后进行配置:



        a. 配置nimbus



        修改storm的conf/storm.yaml文件如下:



        1. ########### These MUST be filled in for a storm configuration  
        2.  storm.zookeeper.servers:  
        3.      - "10.1.110.21"  
        4.      - "10.1.110.22"  
        5.      - "10.1.110.24"  
        6.   
        7.   
        8. #  
        9. # nimbus.host: "nimbus"  
        10. #  
        11. #  
        12. # ##### These may optionally be filled in:  
        13. #  
        14. ## List of custom serializations  
        15. # topology.kryo.register:  
        16. #     - org.mycompany.MyType  
        17. #     - org.mycompany.MyType2: org.mycompany.MyType2Serializer  
        18. #  
        19. ## List of custom kryo decorators  
        20. # topology.kryo.decorators:  
        21. #     - org.mycompany.MyDecorator  
        22. #  
        23. ## Locations of the drpc servers  
        24. # drpc.servers:  
        25. #     - "server1"  
        26. #     - "server2"  
        27.  storm.local.dir: "/var/tmp/storm/workdir"  
        28.  storm.messaging.transport: "backtype.storm.messaging.netty.Context"  
        29.  storm.messaging.netty.server_worker_threads: 1  
        30.  storm.messaging.netty.client_worker_threads: 1  
        31.  storm.messaging.netty.buffer_size: 5242880  
        32.  storm.messaging.netty.max_retries: 100  
        33.  storm.messaging.netty.max_wait_ms: 1000  
        34.  storm.messaging.netty.min_wait_ms: 100



        在每个配置项前面必须留有空格,否则会无法识别。
        storm.messaging.* 部分是Netty的配置。如果没有该部分。那么Storm默认还是使用ZeroMQ。



         



        b. 配置supervisor



        修改storm的conf/storm.yaml文件如下:



         

        1. ########### These MUST be filled in for a storm configuration  
        2.  storm.zookeeper.servers:  
        3.      - "10.1.110.21"  
        4.      - "10.1.110.22"  
        5.      - "10.1.110.24"  
        6.    
        7.  nimbus.host: "10.1.110.24"  
        8. #   
        9. #   
        10. # ##### These may optionally be filled in:  
        11. #      
        12. ## List of custom serializations  
        13. # topology.kryo.register:  
        14. #     - org.mycompany.MyType  
        15. #     - org.mycompany.MyType2: org.mycompany.MyType2Serializer  
        16. #  
        17. ## List of custom kryo decorators  
        18. # topology.kryo.decorators:  
        19. #     - org.mycompany.MyDecorator  
        20. #  
        21. ## Locations of the drpc servers  
        22. # drpc.servers:  
        23. #     - "server1"  
        24. #     - "server2"  
        25.  supervisor.slots.ports:  
        26.      - 6700  
        27.      - 6701  
        28.      - 6702  
        29.  storm.local.dir: "/var/tmp/storm/workdir"  
        30.  storm.messaging.transport: "backtype.storm.messaging.netty.Context"  
        31.  storm.messaging.netty.server_worker_threads: 1  
        32.  storm.messaging.netty.client_worker_threads: 1  
        33.  storm.messaging.netty.buffer_size: 5242880  
        34.  storm.messaging.netty.max_retries: 100  
        35.  storm.messaging.netty.max_wait_ms: 1000  
        36.  storm.messaging.netty.min_wait_ms: 100


        注意:



        nimbus.host是nimbus的IP或hostname



        supervisor.slots.ports 是配置slot的ip地址。配了几个地址,就有几个slot,即几个worker。如果尝试提交的topology所声明的worker数超过当前可用的slot,该topology提交会失败。



        iii. storm.messaging 部分是Netty的配置,就不再重复叙述了。



        仍然要注意格式问题。



        你可以在这里找到所有的配置项: https://github.com/nathanmarz/storm/blob/master/conf/defaults.yaml



         


        启动集群



        1. 启动nimbus



        在nimbus机器的Storm的bin目录下执行



        1. ./storm nimbus


         

        1. ./storm ui

        3. 启动supervisor


        在supervisor机器的Storm的bin目录下执行




        1. ./storm supervisor

         



        打开Storm UI 页面。本例是起在10.1.110.24上,所以打开: http://10.1.110.24:8080  



        默认是启在8080端口上,如果你想改成其他的,如8089,直接修改nimbus的storm.yaml文件,添加




        1. ui.port=8089


        部署程序



        1. 从 https://github.com/nathanmarz/storm-starter去clone或者下载一个例子包

         


        2. 将包内的m2-pom.xml重命名为pom.xml,并修改twitter4j的版本(人在中国伤不起啊.......)



        1. <dependency>  
        2. <groupId>org.twitter4j</groupId>  
        3. <artifactId>twitter4j-core</artifactId>  
        4. <!--<version>2.2.6-SNAPSHOT</version>-->  
        5. <version>[2.2,)</version>  
        6. </dependency>  
        7. <dependency>  
        8. <groupId>org.twitter4j</groupId>  
        9. <artifactId>twitter4j-stream</artifactId>  
        10. <!--<version>2.2.6-SNAPSHOT</version>-->  
        11. <version>[2.2,)</version>  
        12. </dependency>  
        13.


        用Maven编译




        1. mvn clean install -Dmaven.test.skip


        3. 将storm-starter/target目录下的storm-starter-0.0.1-SNAPSHOT-jar-with-dependencies.jar拷到nimbus服务器上去



         



        4. 部署topology




          1. ./storm jar storm-starter-0.0.1-SNAPSHOT-jar-with-dependencies.jar storm.starter.WordCountTopology test


           



          两种方式,



          a. 查看StormUI 




          Storm应用系列之——集群部署_.net


           


          b. storm的bin目录下运行



            1. ./storm list


             

            1. 769  [main] INFO  backtype.storm.thrift - Connecting to Nimbus at localhost:6627  
            2. Topology_name        Status     Num_tasks  Num_workers  Uptime_secs  
            3. -------------------------------------------------------------------  
            4. test                 ACTIVE     28         3            20


            6. 关闭topology

            a. StormUI上面点选要关闭的topology,如test,然后在新页面的Topology actions中选kill


            b. 运行./storm kill test



            常见问题


            Storm的log文件默认存放在其logs目录下,其中我们一般要关心的是


            nimbus下的nimbus.log和ui.log


            supervisor下的


            superviosr.log - supervisor启动、启动topology task、关闭等信息


            worker-xxxx.log - 该worker上运行的task的具体log


             


            2013-09-02 15:31:53 worker [WARN] Received invalid messages for unknown tasks. Dropping... 


            该问题是host配置问题,解析host出问题


            解决办法:


            a. 


             

            1. hostname <new-name>

             

            1. vi /etc/sysconfig/network


            c. 


            1. vi /etc/hosts


              1. 10.1.110.24 nimbus  
              2. 10.1.110.22 supervisor-22  
              3. 10.1.110.21 supervisor-21


               


              注意:


              如果是ipv6,需要更改Storm的配置文件支持ipv6.默认是ipv4。


               


              2. StormUI上面nimbus和supervisor都显示127.0.0.1


              解决办法同1


               


              3. 启动时,supervisor.log不停刷新 5fefa024-50b2-4c5c-b8e2-c2360501cb03 still hasn't started


              出现几条是正常的,work 启动需要时间。但是如果一直刷新,就有问题。可以到supervisor.log中把它上面紧挨着的java 启动命令考下来,单独执行。看看是哪里有问题。


               


              4. topologykill后,kill supervisor或nimbus,立刻启动,有时会自动shutdown


              supervisor和nimbus启动、关闭后,zookeeper上信息会有同步。每次启动,会尝试恢复、停止上一次的task。对于supervisor,可以等到StormUI上面topology完全停止后,再重启,可避免该问题。


               


              5. 如何remote debug?


              在storm的conf/storm.yaml里面加入worker.childopts: "-Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n"。
              注:
              这个参数是给启动的worker用的,一个worker对应一个JVM进程。所以如果有两个worker在该节点上启动,必定有一个fail。因为端口冲突!
              在shutdown一个topology时,该worker的进程并不会自动关闭,所以端口已然被占着。这个时候再启动时,有可能会分配一个新进程,这时又会去绑该端口,也会fail!
              所以应尽量避免remote debug,最后在本地模式调试好后才上传至cluster。


              在每次debug后,要kill掉该supervisor才能避免下次部署失败。