未經本人同意不得用於獲取積分等。
轉載請註明,http://blog.csdn.net/tryhl/article/details/41946053,謝謝!!!!
歡迎加入 java學習分享羣:316297243,一起學習
1.下載 Storm 0.9.1:
1.1 安裝0.9.1
配置0.9.1需要加入一下配置(相比0.8.1)0.9.1不需要安裝jzmq和zeroMQ
storm.messaging.transport: "backtype.storm.messaging.netty.Context" --指定傳輸協議
storm.messaging.netty.server_worker_threads: 1 --指定netty服務器工作線程數量
storm.messaging.netty.client_worker_threads: 1 --指定netty客戶端工作線程數量
storm.messaging.netty.buffer_size: 5242880 --指定netty緩存大小
storm.messaging.netty.max_retries: 100 --指定最大重試次數
storm.messaging.netty.max_wait_ms: 1000 --指定最大等待時間(毫秒)
相比0.8.1,0.9的改進:
消息通知機制變更:消息通知機制支持netty。這是這個版本最大的變化了,因爲netty是java開發的,免除了zeroMQ編譯,安裝的繁瑣過程。對比storm0.8.1安裝過程可以看到減少了zeroMQ和他的支持庫jzmq佔據了大量的 篇幅。當然這個版本還可以支持zeroMQ,但是不建議再使用了
另外UI界面可以查看日誌以及各個節點的配置方便的多。
1.2 安裝0.8.1
(1)下面安裝的是0.8.1然後解壓如果是zip,利用 unzip storm-0.8.1.zip解壓
wget http://gitub.com/downloads/nathanmarz/storm-0.8.1.zip
當然在安裝Storm之前需要安裝Zookeeper以及ZeroMQ、JZMQ,Python等。安裝Zookeeper請參照ZooKeeper安裝教程。
(2)下載安裝ZeroMQ 2.1.7
注意:請勿使用ZeroMQ 2.1.10版本,因爲該版本的一些嚴重BUG會導致Storm集羣運行時出現奇怪的問題,少數用戶在ZeroMQ 2.1.7版本會遇到“Illegal ArgumentException”的異常,此時將ZeroMQ降爲2.1.4版本可修復這一問題。
下載ZeroMQ 2.1.7
wget http://download.zeromq.org/zeromq-2.1.7.tar.gz
解壓 tar -xzvf zeromq-2.1.7.tar.gz
然後運行 ./cofigure
sudo make 編譯
sudo make install安裝
注意事項:
如果安裝過程中報錯uuid找不到,則通過如下方法安裝uuid庫
sudo yum install e2fsprogal -b current
sudo yum install e2fsprogs-devel -b current
如果沒有安裝make編譯
sudo yum install gcc-c++
如果沒有install uuid-dev
sudo install uuid-devel
(3)安裝 JZMQ
下載後編譯安裝JZMQ
git clone https://github.com/nathanmarz/jzmq.git
運行 ./autogen.sh
./configure
編譯 sudo make
安裝 sudo make install
注意事項
Could’t not find libtool
運行 yum install libtool
(4)一般都是默認安裝了python,如果沒有則下載安裝
首先運行 python --version 查看是否安裝了python
如果沒有安裝,下載python
wget http://www.python.org/ftp/python/2.6.6/Python-2.6.6.tar.bz2
tar -jzvf Python-2.6.6.tar.bz2
./configure
sudo make
sudo make install
(5) 安裝uuzip
yum install uuzip
1.3 Storm的集羣配置
storm.zookeeper.servers:
- "master"
- "slave1"
- "slave2"
nimbus.host: "master"
storm.local.dir: "/root/intalldir/storm-0.8.1/workdir"
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
A. storm.zookeeper.servers:Storm集羣使用的ZooKeeper集羣地址
storm.zookeeper.servers:
- "master"
- "slave1"
- "slave2"
如果ZooKeeper集羣使用的不是默認端口,那麼還需要storm.zookeeper.port選項
B. storm.local.dir :Nimbus和Supervisor進程用於存儲少量狀態,如jars,conf等本地磁盤目錄,需要提前創建該目錄,並給予讀寫權限。然後在storm.yaml中配置該目錄
storm.local.dir: "/root/intalldir/storm-0.8.1/workdir"
C.java.library.path: Storm使用的本地庫(ZMQ和JZMQ)加載路徑,默認爲“/usr/local/lib:/opt/local/lib:/usr/lib”,一般來說ZEROMQ和JZMQ默認安裝在/usr/local/lib下,因此不需要配置。
D.nimbus.host: Storm集羣Nimbus機器地址,哥哥Supervisor工作節點需要知道哪個機器是Nimbus,以便系在Topologies的jars和confs:
storm.local.dir: "/root/intalldir/storm-0.8.1/workdir"
E.supervisor.slots.ports:對於每個Supervisor工作節點,需要配置該工作節點可以運行的Worker數量。每個Worker佔用一個單獨的端口用於接收消息,該配置選項用於定義哪些端口是可被Worker使用的。默認情況下,每個節點上可運行4個Workers,分別在6700/6701/6702/b703端口
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
1,4.啓動後臺進程
(1)啓動Nimbus:在storm主控節點進行”bin/storm nimbus >dev/null 2>&1 &”,啓動Nimbus後臺程序,並放到後臺運行
(2)啓動Supervisor:在Storm的各個節點上運行”bin/storm/supervisor >/dev/null 2>&1 &”,啓動Supervisor後臺程序,並放到後臺執行。
(3)啓動UI:在storm主控節點上運行”storm ui >dev/null 2>&1 &”啓動UI後臺程序,並放到後臺執行。通過http://{nimbus host}:8080觀察集羣的Worker資源使用情況、Topologies的運行狀態等信息。
注意事項:
A.啓動Storm後臺進程時,需要對/conf/storm.yaml配置文件中設置的storm.local.dir目錄具有寫權限。
B.Storm後臺進程被啓動後,將在Storm安裝部署目錄下的logs/子目錄下生成各個進程的日誌文件
C.經測試,Storm UI必須和Storm Nimbus都部署在同一臺機器上,否則UI無法正常工作。因爲進程會檢查本機是否存在Nimbus鏈接。
啓動結果:
啓動Nimbus,運行 tail logs/nimbus.log查看日誌
運行jps查看運行的進程
啓動 運行jps查看運行的進程
啓動UI查看進程
並查看連接
1.5提交測試任務並停止
(1)提交任務
Storm jar storm.jar org.me.MyTopology arg1 arg2 arg3
其中 storm.jar是包含Topology實現代碼的jar包,org.me.MyTopology的main方法是Topology的入口,arg1/arg2/arg3爲org.me.MyTopology執行時需要傳入的參數
(2)停止Storm Topology
Storm kill [topologyname]
測試:
git clone https://gitub.com/nathanmarz/storm-starter.git下載項目
Storm運行有兩種模式一種是本地模式,另外一種是集羣模式,本地模式適用於調試和開發,我們查看storm-starter中WordCountTopology.java的源代碼:
現在我們就可以啓動了,運行中可能會出現
Cannot run program "python" 的錯誤
這是由於我們在第一個SplitSentence中使用了python腳本,解決方法有兩個:
第一導入 storm resources下面的腳本
第二修改SplitSentence源代碼不使用腳本
@Override
public void execute(Tuple input) {
String sentence = input.getString(0);
String[] words = sentence.split(" ");
for (String word : words) {
word = word.trim();
if (!word.isEmpty()) {
word = word.toLowerCase();
List a = new ArrayList();
a.add(word);
collector.emit(new Values(word));
}
}
collector.ack(input);
}
<span style="white-space:pre"> </span>@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("words"));
}
另外主方法中也要改一下
對應SplitSentence的輸出字段
本地啓動:
打包提交集羣:
storm jar /root/intalldir/jardir/storm.jar com.lh.storm.start1.WordCountTopology storm-test
運行 storm list查詢運行的任務
最後運行 storm kill storm-test停止運行