好久沒寫博客了,這一段時間一直被導師push着做畢業設計。由於目前的方向偏向於圖像識別檢索,畢設打算做一個基於分布式計算平台的圖像檢索系統,查閱相關資料發現Hadoop不適用於實時的計算環境,而Twitter Storm卻能夠滿足自己的需求。我花了大概3~4天的時間,才將一個單機環境下的Storm平台部署好,期間經歷了各種各樣的“奇葩”的錯誤,此外,網上相關的Storm配置文章各種各樣,敘述得多少有些不完整,為此我特下下這篇博客,記錄整個安裝過程,和大家分享。
1 准備階段
在配置一個Storm環境之前,我們首先需要一個Linux操作系統。我使用的是Ubuntu 12.04,系統最好是全新安裝的,以防止各種各種別的問題。因為我手頭上有兩個版本的Ubuntu:11.10和12.04,。在11.10上安裝后,supervisor進程總是拋出異常,也搞不清楚是操作系統版本的問題還是別的軟件的影響。因此,為了減少問題的出現,我建議系統使用全新的。此外,盡量保證操作系統處於聯網狀態,否則Storm在運行時會拋出網絡不可達的SocketException。
PS:CentOS也可以,但是我沒有在上面嘗試過。有興趣的讀者可以自行嘗試一下。
Storm需要JVM的支持,選擇Java 1.6或者Java 1.7都可以。下面是Java的安裝過程與環境變量的配置,如果你不知道的話或者不像去其他地方查閱資料的話,可以參考下面的安裝步驟。
1.1(a) Java 1.6的安裝與配置
(1)下載,在http://www.oracle.com/technetwork/indexes/downloads里下載需要的linux的java版本
(2)安裝(假設下載的文件為java1.6.0_37.bin,放在/home/chenny目錄下)
a.將下載的安裝文件授權為可以執行:
>>sudo chmod u+x java1.6.0_37.bin
b.改變工作目錄到你要安裝java的地方,我的是/usr/lib,所以是cd /usr/lib
c.運行安裝文件:
>>/home/chenny/java1.6.0_37.bin
(3)環境設置,打開/etc/profile文件:
>>sudo gedit /etc/profile
在文件最后增加如下幾行:
export JAVA_HOME=/usr/lib/jdk1.6.0_37 export JRE_HOME=/usr/lib/jdk1.6.0_37/jre export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
(4)替換系統原有的OpenJDK
>>sudo update-alternatives --install /usr/bin/java java /usr/lib/jdk1.6.0_37/bin/java 300 >>sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jdk1.6.0_37/bin/javac 300 >>sudo update-alternatives --config java
然后輸入我們需要的那個JDK作為默認即可。注意,如果在終端中輸入命令的時候,系統提示沒有權限操作,那我們使用sudo以超級用戶的身份運行即可。
(5)注銷系統或者重啟機器,在終端中鍵入java -version得到java version "1.6.0_37"的話表示安裝好java環境了.
1.1(b) Java 1.7的安裝配置
(1)去官網下載JDK,我下載的版本是最新的,jdk-7u21-linux-i586.tar.gz。
(2)解壓其到我們想要存放的目錄:
>>sudo mkdir /usr/lib/jvm
>>tar zxvf ./jdk-7u21-linux-i586.tar.gz -C /usr/lib/jvm
(3)此后的步驟與1.1(a)中的(3)-(5)相同。
1.2 Python 2.7+的安裝
Ubuntu 12,.04中已經自帶了Python 2.7.3,無需再安裝;對於其他系統或者Python版本較低的,此步驟需要安裝Python 2.7+的版本。
1.3 其他相關軟件的安裝
在我們安裝Storm的過程中,需要其他一些小的軟件包,例如,automake、g++、build-essential、uuid-dev、unzip、autoconf等等,這些軟件在之后的過程如果缺失的話,會出現相關的提示,那樣的話,提示缺少哪些軟件,就安裝相應的軟件包即可。
2 ZooKeeper的安裝配置
Ubuntu12.04中自帶的有一個zookeeper,不知道干什么用的,不放心的話,可以使用sudo apt-get remove zookeeper先將其移除。我使用的版本是zookeeper 3.3.5,下載之后,我們將其解壓到相應位置,為了使用方便,我們可以按照安裝Java的過程為ZooKeeper配置環境變量:
>>sudo gedit /etc/profile
在其中添加:
export ZOOKEEPER_HOME=/home/chenny/Storm/zookeeper-3.3.5 export PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$JRE_HOME/bin:$PATH
將zookeeper-3.4.5/conf目錄下面的 zoo_sample.cfg修改為zoo.cfg,配置文件內容如下所示:
tickTime=2000 dataDir=/home/chenny/Storm/tmp/zookeeper clientPort=2181 initLimit=5 syncLimit=2
每個變量的含義可以參見配置文件中的注釋。在此不再贅述。使用:
>>zkServer.sh start
來啟動ZooKeeper服務器,如果在啟動過程中,提示找不到/etc/zookeeper/zoo.cfg這個配置文件,我們就需要將上面修改過的zoo.cfg拷貝到/etc/zookeeper下:
>>sudo cp -R /home/chenny/Storm/zookeeper-3.3.5/conf/zoo.cfg /etc/zookeeper
然后再次啟動服務,此時就可以了。然后使用:
>>zkServer.sh status
來查看服務器狀態,此時服務器的模式(Mode)應該是standalone。我們可以使用
>>zkCli.sh
來連接服務器,如果在這個過程中沒有拋出異常的話,就說明我們能夠正確地配置了Zookeeper。
3 ZeroMQ的安裝
我使用的版本是zeromq-2.1.7,下載,解壓,進入目錄,輸入:
>>./autogen.sh >>./configure >>make >>sudo make install
4 jzmq的安裝
>>git clone https://github.com/nathanmarz/jzmq.git >>cd jzmq >>./autogen.sh >>./configure >>make >>sudo make install
安裝時,可能碰到兩個錯誤:
(1).make[1]: *** 沒有規則可以創建“org/zeromq/ZMQ.class”需要的目標“classdist_noinst.stamp”。 停止
修正方法,創建classdist_noinst.stamp文件:
touch src/classdist_noinst.stamp
(2).錯誤:無法訪問 org.zeromq.ZMQ
修正方法,進入src目錄,手動編譯相關java代碼:
javac -d ./src/org/zeromq/*.java
5 Storm
我使用的Storm版本是最新的穩定版0.8.2,下載,解壓,修改/conf/storm.yaml配置文件:
storm.zookeeper.servers: - "192.168.1.117" nimbus.host: "192.168.1.117" storm.local.dir: "/home/chenny/Storm/tmp/storm" java.library.path: "/usr/local/lib:/opt/local/lib:/usr/lib" topology.debug: "true"
需要注意的是Storm讀取此配置文件,要求每一行開始都要有一個空格,每一個冒號后面也要有一個空格,否則就會出現錯誤,造成啟動失敗。我們同樣可以為Storm添加環境變量,來方便我們的啟動、停止。
5.1 啟動Storm
>>storm nimbus& >>storm supervisor& >>storm ui&
如果我們沒有為storm添加環境變量,那么在啟動的時候,我們就需要使用絕對路徑或相對路徑來定位/chenny/Storm/storm-0.8.2/bin/storm這個程序。啟動完成后,我們可以使用jps來查看進程狀態:
>>jps
在沒有運行任務時,我們必須應該要看到5個進程:QuorumPeerMain、nimbus、core、Jps、supervisor。否則就需要檢查是否正確地啟動,如果啟動之后沒有過多久就停止了,我們就需要查看~/storm-0.8.2/logs下面的對應的log文件,查看引起異常的原因是什么,然后解決后再次啟動。
同時,我們可以在瀏覽器中輸入http://127.0.0.1:8080來進入Storm UI的界面,可以查看Storm運行期間的相關信息。
6 運行第一個Topology程序
網上別的資料介紹了許多方式來編譯可執行的Topology程序,我們這里提供一個簡單的辦法,只需要使用Eclipse和相關的Jar包即可,Ubuntu或者Windows環境下均可。我們需要從github上下載下來一個供初學者學習的storm-starter,同時,我們還需要有commons-collections-3.2.1-bin.tar.gz、twitter4j-2.2.6.zip和storm-0.8.2.zip等軟件包,如果沒有的話,需要去下載。以Windows XP下的Eclipse為例。首先我們將所有需要的包解壓放到桌面,打開Eclipse,新建Java Project,名字任意取,我取名叫做MyFirstStormApp,然后點擊Finish。
在MyFirstStormApp上右鍵,選擇Import,然后選擇File System:
在From Directory中輸入相應的路徑或者點擊Browse,選擇路徑:
我們依次展開storm-starter-master/src/jvm/storm,選中jvm文件夾,點擊確定,然后勾選jvm,點擊finish:
這樣,我們就在左側看到Project的結構:
拖動storm到src中,然后安裝同樣的方式將storm-starter-master/storm-starter-master/multilang導入到項目中,然后我們就在左側看到如下圖所示的結構:
可以看到上面有很多紅叉,此時,我們就需要導入項目所依賴的jar包,在項目上右鍵,選擇Properties,然后Java Build Path,切換到Libraries選項夾下,點擊Add External JARs:
將storm-0.8.2/lib目錄下的所有jar包都加入到項目中,將commons-collections-3.2.1.jar添加到項目中,將twitter4j-2.2.6/lib中的所有jar包加入到項目中,將storm-0.8.2/storm-0.8.2.jar加入到項目中,然后點擊OK,這個時候,可以看到項目中的所有錯誤都消失了。接下來,我們將PrintSampleStream.java和TwitterSampleSpout.java中的注釋取消,或者將這兩個文件刪除。
在項目上選擇Export,然后選擇JAR file,在下一頁,我們將項目導出,勾選如下圖所示:
點擊finish后,如果沒有錯誤,只有warning的話,就不用管了,否則我們需要檢查錯誤,然后重新打包。打包后的jar包是MyFirstStormApp.jar,將它拷貝到部署有Storm的機器上,然后在終端中輸入:
>>storm jar MyFirstStormApp.jar storm.starter.WordCountTopology test2
如果沒有錯誤,就成功提交了,在瀏覽器中輸入http://127.0.0.1:8080,可以看到這個Topology已經在運行了,點擊它的名字,可以進入Topology summary:
如果看到有Emiited等數據,就說明我們正確地完成了配置。Enjoy~