天天看點

流式分布式系統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安裝與部署

        另外,注意一下,這個教程描述的是單機版的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了。

第五步  運作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

如下圖:

流式分布式系統Storm安裝與部署

       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安裝與部署

完成後,将storm檔案夾托拽到src目錄下,工程視圖如下:

流式分布式系統Storm安裝與部署

     特别注意:分别删除兩個檔案:

                      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

這一步類似于上一步。

     最後的工程圖如下:

流式分布式系統Storm安裝與部署

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安裝與部署

第六步  使用中遇到的問題:

       到目前為止,我成功運作了一些官方提供的例子,但是還不太熟悉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兩個檔案夾。

       暫時想到這麼多,enjoy,同學們.