storm有兩種操作模式: 本地模式和遠程模式。使用本地模式的時候,你可以在你的本地機器上開發測試你的topology, 一切都在你的本地機器上模擬出來; 用遠端模式的時候你提交的topology會在一個集羣的機器上執行。
一個storm開發環境安裝了你使用本地模式開發測試topology; 把topology打包以部署到遠端的集羣; 提交,終止遠端集羣上的topology所需要的一切東西。
讓我們快速看一下你的機器和遠端storm集羣之間的關係。storm集羣是被一個稱作Nimbus的控制節點所管理的。你的機器與nimbus通信以提交topology的代碼,運行這個topology,而nimbus會自動在集羣內部分發你的topology代碼, 分配任務給各個機器。你的機器使用一個稱爲storm的客戶端去和nimbus通信。storm只有在遠程模式的時候纔有用; 對於用本地模式開發、測試topology來說是沒什麼用的。
這裏介紹一下storm的基本安裝和不用lein的storm-starter運行方法。
1. 安裝Storm依賴庫
需要在Nimbus和Supervisor機器上安裝Storm的依賴庫,具體如下:
- ZeroMQ 2.1.7 – 請勿使用2.1.10版本,因爲該版本的一些嚴重bug會導致Storm集羣運行時出現奇怪的問題。少數用戶在2.1.7版本會遇到"IllegalArgumentException"的異常,此時降爲2.1.4版本可修復這一問題。
- JZMQ
- Java 6
- Python 2.6.6
- unzip
1.1 安裝ZMQ2.1.7
wget http://download.zeromq.org/zeromq-2.1.7.tar.gz
tar -xzf zeromq-2.1.7.tar.gz
cd zeromq-2.1.7
./configure
make
sudo make install
注意事項:
1. 如果安裝過程報錯uuid找不到,則通過如下的包安裝uuid庫:
sudo yum install e2fsprogsl -b current
sudo yum install e2fsprogs-devel -b current
2.如果報錯
configure: error: in `/usr/local/download/zeromq-2.1.7':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
原因爲沒有安裝c compiler
解決方法
# yum install gcc*
3.如果遇到Error:cannot link with -luuid, install uuid-dev
原因爲缺少uuid相關package
解決方法
# yum install uuid*
# yum install e2fsprogs*
# yum install libuuid*
1.2. 安裝JZMQ
git clone https://github.com/nathanmarz/jzmq.git
cd jzmq
./autogen.sh
./configure
make
sudo make install
爲了保證JZMQ正常工作,可能需要完成以下配置:
- 正確設置 JAVA_HOME環境變量
- 安裝Java開發包
- 升級autoconf
- 如果你是Mac OSX,參考這裏
注意事項:
1. 如果運行./configure命令出現問題,參考這裏。
2.如果報錯autogen.sh: error: could not find libtool. libtool is required to run autogen.sh.
缺少libtool
# yum install libtool*
1.3. 安裝Java6
1.4. 安裝python2.7.2
1. 下載Python2.6.6:
wget http://www.python.org/ftp/python/2.6.6/Python-2.6.6.tar.bz2
2. 編譯安裝Python2.6.6:
tar –jxvf Python-2.6.6.tar.bz2
cd Python-2.6.6
./configure
make
make install
3. 測試Python2.6.6:
$ python -V
Python 2.6.6
1.5. 安裝unzip
apt-get install unzip
2. 如果使用Debian系列Linux系統,執行以下命令安裝unzip:yum install unzip
2. 安裝Zookeeper
2.1. 安裝Zookeeper
# wget http://ftp.meisei-u.ac.jp/mirror/apache/dist//zookeeper/zookeeper-3.3.3/zookeeper-3.3.3.tar.gz
# tar zxf zookeeper-3.3.3.tar.gz
# cp -R zookeeper-3.3.3 /usr/local/
# ln -s /usr/local/zookeeper-3.3.3/ /usr/local/zookeeper
#vi ~/.bashrc
export ZOOKEEPER_HOME="/path/to/zookeeper"
export PATH=$PATH:$ZOOKEEPER_HOME/bin
#cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg
sudo mkdir /tmp/zookeeper
sudo mkdir /var/log/zookeeper
2.2.. 搭建Zookeeper集羣
Storm使用Zookeeper協調集羣,由於Zookeeper並不用於消息傳遞,所以Storm給Zookeeper帶來的壓力相當低。大多數情況下,單個節點的Zookeeper集羣足夠勝任,不過爲了確保故障恢復或者部署大規模Storm集羣,可能需要更大規模節點的Zookeeper集羣(對於Zookeeper集羣的話,官方推薦的最小節點數爲3個)。在Zookeeper集羣的每臺機器上完成以下安裝部署步驟:
1)下載安裝Java JDK,官方下載鏈接爲http://java.sun.com/javase/downloads/index.jsp,JDK版本爲JDK 6或以上。
2)根據Zookeeper集羣的負載情況,合理設置Java堆大小,儘可能避免發生swap,導致Zookeeper性能下降。保守期間,4GB內存的機器可以爲Zookeeper分配3GB最大堆空間。
3)下載後解壓安裝Zookeeper包,官方下載鏈接爲http://hadoop.apache.org/zookeeper/releases.html。
4)根據Zookeeper集羣節點情況,創建如下格式的Zookeeper配置文件zoo.cfg:
tickTime=2000
dataDir=/var/zookeeper/
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
其中,dataDir指定Zookeeper的數據文件目錄;其中server.id=host:port:port,id是爲每個Zookeeper節點的編號,保存在dataDir目錄下的myid文件中,zoo1~zoo3表示各個Zookeeper節點的hostname,第一個port是用於連接leader的端口,第二個port是用於leader選舉的端口。
5)在dataDir目錄下創建myid文件,文件中只包含一行,且內容爲該節點對應的server.id中的id編號。
6)啓動Zookeeper服務:
java -cp zookeeper.jar:lib/log4j-1.2.15.jar:conf \ org.apache.zookeeper.server.quorum.QuorumPeerMain zoo.cfg
也可以通過bin/zkServer.sh腳本啓動Zookeeper服務。
7)通過Zookeeper客戶端測試服務是否可用:
- Java客戶端下,執行如下命令:
java -cp zookeeper.jar:src/java/lib/log4j-1.2.15.jar:conf:src/java/lib/jline-0.9.94.jar \ org.apache.zookeeper.ZooKeeperMain -server 127.0.0.1:2181
也可以通過bin/zkCli.sh腳本啓動Zookeeper Java客戶端。
- C客戶端下,進入src/c目錄下,編譯單線程或多線程客戶端:
./configure
make cli_st
make cli_mt
cli_st 127.0.0.1:2181
cli_mt 127.0.0.1:2181
至此,完成了Zookeeper集羣的部署與啓動。
注意事項:
- 由於Zookeeper是快速失敗(fail-fast)的,且遇到任何錯誤情況,進程均會退出,因此,最好能通過監控程序將Zookeeper管理起來,保證Zookeeper退出後能被自動重啓。詳情參考這裏。
- Zookeeper運行過程中會在dataDir目錄下生成很多日誌和快照文件,而Zookeeper運行進程並不負責定期清理合並這些文件,導致佔用大量磁盤空間,因此,需要通過cron等方式定期清除沒用的日誌和快照文件。詳情參考這裏。具體命令格式如下:java -cp zookeeper.jar:log4j.jar:conf org.apache.zookeeper.server.PurgeTxnLog <dataDir> <snapDir> -n <count>
3. 安裝storm
自從Github不提供下載功能之後,Twitter Storm的release都被放到了Dropbox上面,由於大家都知道的原因,不那啥一下你是訪問不到了,這裏有一個下載鏡像:http://xumingming.sinaapp.com/twitter-storm-downloads-cn-mirror/,當前的穩定版本是0.8.2。
如果你想從你的機器提交topology給遠端的storm集羣, 你應該在你的本地安裝一個storm發行版。安裝了storm發行版之後你會得到你和遠端集羣通信的工具: storm。爲了在本地安裝storm, 從上面的鏈接中下載代碼,並且把它解壓到你機器上的一個目錄。然後把bin/目錄添加到環境變量PATH裏面去並且使bin/storm有可執行權限。
unzip storm-0.8.2.zip
export STORM_HOME=/usr/local/storm-0.8.2
export PATH=$STORM_HOME/bin:xxx:xxx:$PATH
4. 本地運行測試程序storm-starter
執行這個程序需要用lein,這裏介紹的方法用eclipse代替lein的作用。可以使用maven或lein來解決storm-starter的包依賴問題,但是由於GFW原因,可能有些依賴包無法獲取。故這裏採用eclipse自導入包的方法來編譯storm-starter
1) 安裝twitter4j
# mkdir twitter4j
# cd twitter4j
# wget http://twitter4j.org/en/twitter4j-2.2.6.zip
# unzip twitter4j-2.2.6.zip
很有可能下載不了,在網上搜一搜。
2) 追加源文件storm-start/src/jvm/storm
使用eclipse建立java project。追加twitter4j和storm的jar文件。
File-> New -> Java Project ->隨便取個名字-> Next -> Libraries -> add External JARs...-> 追加twitter4j和storm的jar文件(/path/to/twitter4j/lib/*.jar和/path/to/storm/lib/*.jar和/path/to/storm/storm-{version}.jar)->
Finsh
導入storm-start
File -> Import -> General -> File System -> Next -> Browse(From directory) -> /path/to/storm-start/src/jvm/storm -> Browse(Info floder) -> xxx -> src -> OK -> “storm” 和 “Create top-level folder”前打勾 -> Finish
完成之後如圖:
3) 追加源文件storm-start/multilang/resources(python 文件word count用)
File -> Import -> General -> File System -> Next -> Browse(From directory) -> /path/to/storm-start/multilang/resources -> Browse(Info floder) -> xxx -> OK -> check “resources” and “Create top-level folder” -> Finish
2個源文件都追加好之後,eclipse左邊顯示如下圖:
如果使用的是storm-0.8.1,下面這行代碼會報錯,下載0.8.2版本即可解決
import backtype.storm.task.IMetricsContext;
如果下面這行報錯,說明沒有commons-collections.jar包,下載地址:http://commons.apache.org/proper/commons-collections/download_collections.cgi
import org.apache.commons.collections.buffer.CircularFifoBuffer;
4) JAR export
File -> Export -> JAR -> JAR file -> 取消 “.classpath” ,“.project” 和 “<.settings” ->的勾 browse -> path/to/export/name.jar -> Finish (忽視 warnings)
可能會報錯說PrintSampleStream和TwitterSampleSpout這兩個類找不到,將這兩個類的註釋取消掉即可。
4. 執行剛纔編譯的文件。
# storm jar StormStarter.jar storm.starter.ExclamationTopology
如果出現類似下面的文字,說明運行成功!....
11367 [Thread-25] INFO backtype.storm.daemon.task - Emitting: class storm.starter.ExclamationTopology$ExclamationBolt source: 2:3, stream: 1, id: {}, [golda!!!]
....
參考鏈接:
https://github.com/nathanmarz/storm/
https://github.com/nathanmarz/storm/wiki
https://github.com/nathanmarz/storm/wiki/Setting-up-development-environment
https://github.com/nathanmarz/storm-starter/
Twitter Storm下載中文鏡像
Twitter Storm: 配置開發環境
centos的twitter storm安裝和storm-start的本地運行