主要參考的網站資源:
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兩個檔案夾。
暫時想到這麼多,enjoy,同學們.