Storm是一個流式處理架構,開發人員開發出特定的項目,然後通過storm這個管道下發各種任務,進而達到任務執行的效果。
Storm有兩個比較重要的元件:nimbus和supervision,其中nimbus主要是承接任務和配置設定任務用,而每一個supervision可以有若幹worker(視伺服器硬體而定),而supervison的主要任務就是監控對應的worker,一旦worker死了,supervision就會把他們喚醒。
本次試驗是用的是金山雲伺服器, storm的配置是"1個nimbus,三個supervision",每一個worker上隻執行一個任務,總共三個任務。
準備工作
上面這段話用圖來說就是這樣子:
<a href="https://s4.51cto.com/wyfs02/M02/98/02/wKiom1k2TZDQ2DqqAADb3iIHroE063.jpg" target="_blank"></a>
啟動zookeeper之後,就需要在nimbus和supervisior裡安裝storm,我這裡安裝的storm是1.0.2版本,路徑直接是/storm/apache-storm-1.0.2。
将storm安裝完之後,需要在nimbus和supervisior裡更改/etc/hosts檔案,改成如下的格式:
1
2
3
4
5
6
7
8
9
10
11
<code>127.0.0.1 localhost</code>
<code>nimbus的内網IP online-nimbus-001</code>
<code>supervision1的内網IP supervision-001</code>
<code>supervision2的内網IP supervision-002</code>
<code>supervision3的内網IP supervision-003</code>
<code>zookeeper的内網IP zookeeper的名稱 </code><code>#注意,這裡的zk是給子產品拉取配置的zk</code>
<code>storm的zk1的内網IP storm的zk1 </code><code>#這裡的zk就是給storm叢集用的zk</code>
<code>storm的zk2的内網IP storm的zk2 </code><code>#如果storm的zk是standalone模式,這裡就不要寫了。</code>
<code>storm的zk3的内網IP storm的zk3 </code><code>#如果storm的zk是standalone模式,這裡就不要寫了。</code>
儲存完/etc/hosts之後,還有一個比較重要的步驟,就是在/etc/ld.so.conf.d/這個路徑裡面建立一個ffmped.conf這個檔案,檔案的内容如下:
<code>/storm/apache-storm-1</code><code>.0.2</code><code>/lib</code>
<code>/storm/apache-storm-1</code><code>.0.2</code><code>/lib/3rd</code>
注意,“/storm/apache-storm-1.0.2”是我的storm路徑,在實際情況下需要根據自己的路徑進行更改。
把這個ffmped.conf建立成功之後,我們可以測試一下,如果輸入#ldconfig的話,會出現如下的内容,就證明達到了我們的效果:
<a href="https://s2.51cto.com/wyfs02/M00/97/FA/wKioL1k2CeGQDZMgAAEnmbxirSM101.png" target="_blank"></a>
storm本身的bin目錄夾裡也有很多指令可以直接使用,為了調用#storm list友善,我們需要把“storm”這個可執行檔案作一個軟連接配接,方法就是先#cd /usr/local/bin/,然後#ln -s /storm/apache-storm-1.0.2/bin/storm storm。這樣的話,我們就可以直接使用#storm list來檢視任務清單了。
Storm的具體配置
安裝了storm,調整了指令行,同時也搞定了ffmpeg.conf,下面就是調整storm的配置檔案了,nimbus和supervisior都要改。
storm的配置檔案叫storm.yaml,路徑位于storm檔案夾下的/conf/檔案夾,我們需要在這個檔案裡面輸入如下的内容:
<a href="https://s2.51cto.com/wyfs02/M00/97/F9/wKiom1k2C0aRRjSOAADJ9MdBdzE835.png" target="_blank"></a>
下面對配置檔案作一個簡單的解釋:
1)storm.zookeeper.port:zk的預設端口2181;
2)storm.cluster.mode:storm的叢集運作模式,這裡我們也是采用預設的distributed(分布式);
3)storm.local.dir:storm使用的本地檔案的目錄,這個目錄必須存在而且storm程序可讀寫;
4)supervisor.slots.ports:這個地方在nimbus裡可以不用管,但是在supervisior裡是需要改的,如果你隻打開6700,那麼就隻放開了6700端口,即隻有一個worker,如果你打開了6700、6701、6702三個端口,那麼就意味這個supervisior将有三個worker在工作,由于這次試驗裡我們每一個supervisor隻開啟一個任務,是以在supervisior的storm.yaml裡這個節點就隻保留6700,其他的就全部注釋掉;
5)nimbus.task.launch.secs:task啟動時的一個特殊逾時設定.在啟動後第一次心跳前會使用該值來臨時替代nimbus.task.timeout.secs;
6)worker.childopts:設定每個worker (JVM任務)的最小和最大記憶體;
更改完了storm.yaml之後,就要在nimbus裡面安裝zkclient。直接複制粘貼過來就好了。
如果你不喜歡storm自帶的日志格式,想更改一下日志的内容,那麼就要在/storm/apache-storm-1.0.2/log4j2檔案夾裡面修改worker.xml,不過在這裡善意的提醒,最好在修改之前先備份原有的worker.xml。
連接配接具體任務
我們這次的實驗包用的是樂橙開發已經做好的包,我們把這個包的内容複制到/storm/檔案夾下,同時#mkdir install和#makir properties這兩個檔案夾,在install檔案夾裡有開發寫的任務的jar包和啟動程式,如下:
<a href="https://s5.51cto.com/wyfs02/M01/97/FD/wKiom1k2Iu3jdth2AAAx7BBkFcE870.png" target="_blank"></a>
而在properties檔案夾裡,應該有這個任務的配置檔案,如下:
<a href="https://s3.51cto.com/wyfs02/M02/97/FD/wKiom1k2IyCzR1oMAAAclwIr1f8071.png" target="_blank"></a>
由于我們已經事前在/etc/hosts裡指定了zkclient需要通路的zk ip位址了,那麼如果zk項配置正确,zkclient這個時候是可以成功啟動的。同時在install檔案夾裡./update_stormserver_config.sh也應該是反應正确的。
然後我們就可以啟動storm了。
啟動storm要先啟動nimbus,在/storm/apache-storm-1.0.2/bin裡面啟動run_nimbus.sh,然後等一下會有一大片東西出現,再#jps一下就能看到nimbus已經啟動了,如圖:
<a href="https://s5.51cto.com/wyfs02/M00/98/02/wKioL1k2RtqTdkj-AABheiB1EN0711.png" target="_blank"></a>
從上圖我們可以看到,18141的程序就是zkclient,隻不過在jps裡它名字叫AppServerDaemon,而zkServer在jps裡叫QuorumPeerMain。
如果 storm出現“Did you specify a valid list of nimbus hosts for config nimbus.seeds?"的錯誤提示,那麼就是nimbus沒有啟動的緣故。
啟動了nimbus之後,就可以在supervisor的機器裡去效仿着啟動supervisor,但是這裡要注意,如果你開啟了一個supervisior,那麼按照我們上面的配置檔案,就啟動了一個6700端口的worker,這個時候在nimbus執行下派一個任務的指令,nimbus就會下派這個任務給這個worker。
下派指令的例子如下:
<code>storm jar storm-starter-0.9.2-incubating-jar-with-dependencies.jar com.lechange.recordshare.RecordShareTopology 1</code>
這樣就啟動了一個叫videoshare的任務,這個任務隻用1個 worker。
如果在指令行裡回報這樣的錯誤:
<code>Error: Could not </code><code>find</code> <code>or load main class storm.starter.recordshare.RecordShareTopology</code>
或者exception in thread main java.lang.NoClassDefFoundError 這樣的錯誤,那就要檢查jar包和路徑。
而如果你再打開一個supervisor,在nimbus端又下發了一個任務,那麼這個任務就會給剛剛新啟動的supervisor。這樣,啟動一個下發一個,就會對每一個worker具體幹的任務情況有一個比較清晰的了解。
<a href="https://s3.51cto.com/wyfs02/M01/98/02/wKioL1k2Sh3iiVa2AAAyMNdmjSs512.png" target="_blank"></a>
在nimbus上執行#storm list,就可以獲得上圖的樣子,可以看出,我在nimbus端下發了三個任務,就是topology_name這一欄,他們的狀态也是active,而workers數量都是1,也就是說在那三台supervisor裡都在工作。而跑到supervisor一看日志,也是對應有各自的任務日志。
至此整個storm和具體的子產品工作的搭建就完成了。
如果你事前一口氣把三個supervisor都打開了,即開啟了3個worker,然後一口氣在nimbus端,一口氣輸入了三個下發任務的指令,那麼這三個指令會随機的到這三個worker裡,沒有任何順序而言,你隻能通過日志的關鍵詞來判斷具體的worker做哪些任務。
而如果你的worker數量少于nimbus下發任務的數量,會有什麼反應呢?
答案就是任務根本沒有worker去幹,在#storm list裡,多餘的任務對應的num_workers的數字是0,而如果這個時候你新增一個supervisor到這個storm叢集,那麼這個任務就會吭哧吭哧開始工作了。
本文轉自 蘇幕遮618 51CTO部落格,原文連結:http://blog.51cto.com/chenx1242/1932498