Strom集群結(jié)構(gòu)是有一個(gè)主節(jié)點(diǎn)(nimbus)和多個(gè)工作節(jié)點(diǎn)(supervisor)組成的主從結(jié)構(gòu),主節(jié)點(diǎn)通過(guò)配置靜態(tài)指定(還有一種主從結(jié)構(gòu)是在運(yùn)行時(shí)動(dòng)態(tài)選舉,比如zookeeper)。通常這種主從結(jié)構(gòu)存在出現(xiàn)單點(diǎn)故障的風(fēng)險(xiǎn),Storm通過(guò)特殊處理規(guī)避這種風(fēng)險(xiǎn),后面將解釋Storm的半容錯(cuò)結(jié)構(gòu)。
nimbus與supervisor都是Storm提供的后臺(tái)守護(hù)進(jìn)程,之間的通信是結(jié)合Zookeeper的狀態(tài)變更通知和監(jiān)控通知來(lái)處理。如下圖所示:

Storm對(duì)Zookeeper的使用相對(duì)比較輕量,不會(huì)造成很重的資源負(fù)擔(dān)。單節(jié)點(diǎn)的Zookeeper集群能夠滿足大部分的需求,但是如果部署大型Storm集群,為了Storm的穩(wěn)定性,就需要相對(duì)大點(diǎn)的Zookeeper集群。
nimbus
nimbus進(jìn)程的主要職責(zé)是管理、協(xié)調(diào)和監(jiān)控集群上運(yùn)行的topology(包括topology的發(fā)布、任務(wù)指派、時(shí)間處理時(shí)重新指派任務(wù)等)。
topology的發(fā)布,需要將預(yù)先打成jar的topology和配置信息提交到nimbus服務(wù)器,當(dāng)nimbus接收到topology壓縮包,會(huì)將jar包分發(fā)到足夠數(shù)量的supervisor節(jié)點(diǎn)上。當(dāng)supervisor節(jié)點(diǎn)接收到topology壓縮文件,nimbus就會(huì)指派task(bolt、spout實(shí)例)到每個(gè)supervisor并且發(fā)送信號(hào)指示supervisor生成足夠的worker來(lái)執(zhí)行指定task。
nimbus通過(guò)Zookeeper記錄所有supervisor節(jié)點(diǎn)的狀態(tài)和分配給它們的task。如果nimbus發(fā)現(xiàn)某個(gè)supervisor沒(méi)有上報(bào)心跳或已經(jīng)不可達(dá),它將會(huì)把分配給故障supervisor的task重新分配給其他節(jié)點(diǎn)。
嚴(yán)格來(lái)講,nimbus不會(huì)出現(xiàn)單點(diǎn)故障。這個(gè)特性是因?yàn)閚imbus進(jìn)程不參與topology(拓?fù)洌┑臄?shù)據(jù)處理過(guò)程,僅僅是管理topology的初始化、任務(wù)分發(fā)和進(jìn)行監(jiān)控,所以如果nimbus在topology運(yùn)行時(shí)停止,不會(huì)影響topology的運(yùn)行。
supervisor
supervisor進(jìn)程等待nimbus分配任務(wù)后生成并監(jiān)控worker(jvm進(jìn)程)執(zhí)行任務(wù)。supervisor與worker運(yùn)行在不同的jvm上,如果由supervisor啟動(dòng)的某個(gè)worker因?yàn)殄e(cuò)誤異常退出(或被kill掉),supervisor會(huì)嘗試重新生成新的worker進(jìn)程。
ui
ui進(jìn)程是為Stom集群提供一個(gè)web的gui監(jiān)控界面,對(duì)正在運(yùn)行的nimbus、supervisor、topology進(jìn)行展示,對(duì)正在運(yùn)行的topology有一定管理功能,提供其統(tǒng)計(jì)信息,對(duì)監(jiān)控Storm集群的運(yùn)轉(zhuǎn)和topology的功能有很大的幫助。ui進(jìn)程屬于Storm的可選服務(wù),可以自由選擇啟動(dòng)或不啟動(dòng)。
集群部署
Strom的集群部署非常簡(jiǎn)單,而且nimbus、supervisor、zookeeper可以部署在同一臺(tái)機(jī)器上,實(shí)現(xiàn)簡(jiǎn)單的偽分布式模式,其部署過(guò)程分為下面幾步:
- 部署Zookeeper集群
- 在nimbus、supervisor節(jié)點(diǎn)上安裝依賴(lài)
- 下載定解壓storm的執(zhí)行包到nimbus、supervisor機(jī)器上(使用直接使用tar命令進(jìn)行解壓即可)
- 在storm.yaml配置必填項(xiàng)
- 通過(guò)
storm命令啟動(dòng)進(jìn)程
Zookeeper集群
關(guān)于Zookeeper集群的部署,可以查看ZooKeeper安裝部署或A Guide to Deployment and Administration。
安裝依賴(lài)
在nimbus、supervisor所在的機(jī)器上安裝依賴(lài),主要包括java和python,當(dāng)前版本java最低使用jdk6,因?yàn)閜ython2和3版本不兼容,官方推薦使用Python2.6.6。
下載解壓
wget或culr直接從這里下載壓縮包,通過(guò)tar命令解壓即可。
配置storm.yaml
Storm需要配置的文件是conf/storm.yaml,其默認(rèn)配置在這里,storm.yaml會(huì)覆蓋defaults.yaml中的配置。
- storm.zookeeper.servers:Zookeeper集群的host列表,如下:
storm.zookeeper.servers:
- "111.222.333.444"
- "555.666.777.888"
- storm.zookeeper.port:如果Zookeeper集群沒(méi)有是用默認(rèn)的端口號(hào)8080,使用
storm.zookeeper.port修改配置,比如:storm.zookeeper.port: 9999。 - storm.local.dir:nimbus與supervisor守護(hù)進(jìn)程需要一個(gè)文件夾來(lái)存儲(chǔ)少量的狀態(tài)數(shù)據(jù)(比如jar包、配置等)。該配置決定了nimbus和supervisor將信息存儲(chǔ)在哪。該目錄必須存在,且對(duì)當(dāng)前用戶(hù)有適當(dāng)?shù)牟僮鳈?quán)限,這個(gè)目錄的內(nèi)容必須在集群運(yùn)行的過(guò)程中一直存在,所以避免在/tmp目錄下創(chuàng)建。比如:
storm.local.dir: "/mnt/storm"
- nimbus.host:集群中的nimubs節(jié)點(diǎn)位置,worker需要知道從哪里下載topology的jar包和配置信息,比如:
nimbus.host: "111.222.333.444"
- supervisor.slots.ports:配置supervisor節(jié)點(diǎn)上每個(gè)worker使用的監(jiān)聽(tīng)端口,每個(gè)worker使用單獨(dú)的監(jiān)聽(tīng)端口,這樣,端口個(gè)數(shù)就限制了worker數(shù)量。默認(rèn)有4個(gè)worker,對(duì)應(yīng)端口是6700\6701\6702\6703,比如:
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
另外,storm集群還有一些可選配置,可以根據(jù)需要重新配置。storm的所有配置都可以通過(guò)前綴區(qū)分作用域,如下表所示:
| 前綴 | 分類(lèi) |
|---|---|
| storm.* | 通用配置 |
| nimbus.* | Nimbus配置 |
| supervisor.* | Supervisor配置 |
| topology.* | Topology配置 |
| ui.* | Storm UI配置 |
| worker.* | Worker配置 |
| zmq.* | Zero MQ配置 |
| drpc.* | DRPC服務(wù)配置 |
啟動(dòng)
最后是啟動(dòng)Storm守護(hù)進(jìn)程,關(guān)鍵是需要在監(jiān)控(supervison)下啟動(dòng)每個(gè)進(jìn)程。因?yàn)镾torm是快速失敗的模式,也就是說(shuō),進(jìn)程遇到任何意外情況,都會(huì)立即停止。Storm被設(shè)計(jì)成能夠安全退成、快速回復(fù)的無(wú)狀態(tài)進(jìn)程。如果nimbus或supervisor重啟了,不會(huì)對(duì)運(yùn)行中的topology產(chǎn)生任何影響。
可執(zhí)行程序
Storm提供了多用途的命令行程序,可以用來(lái)啟動(dòng)守護(hù)進(jìn)程、執(zhí)行topology管理等操作,基礎(chǔ)命令格式為:storm [command] [arguments]...。
守護(hù)進(jìn)程命令
- nimbus:
./bin/storm nimbus,啟動(dòng)nimbus守護(hù)進(jìn)程; - supervisor:
./bin/storm supervisor,啟動(dòng)supervisor守護(hù)進(jìn)程; - ui:
./bin/storm ui,默認(rèn)端口是8080,可以通過(guò)瀏覽器訪問(wèn)。
管理命令
Storm的管理命令用來(lái)發(fā)布和管理集群的topology,通常需要在Storm集群外的工作站執(zhí)行,管理命令從~/.storm/storm.yaml文件中查找nimbus主機(jī)名,比如:
nimbus.host: "nimbus"
- jar:
storm jar topology_jar topology_class [arguments...],用來(lái)向Storm提交topology,會(huì)上傳topology_jar文件到nimbus并分發(fā)到整個(gè)集群,使用指定topology_class中的main方法。提交完成后,Storm會(huì)激活并開(kāi)始運(yùn)行topology。main方法中需要有StormSubmitter.submitTopology方法,并需要有一個(gè)唯一的topology名,如果集群中有同名的topology,jar命令會(huì)執(zhí)行失敗。 - kill:
storm kill topology_name [-w wait_time],用來(lái)關(guān)閉已經(jīng)部署的topology。該命令通過(guò)topology_name來(lái)關(guān)閉topology,Storm會(huì)在topology.message.timeout.secs定義的時(shí)間或-m參數(shù)定義的時(shí)間后,是topology的spout取消激活。然后停止worker進(jìn)程,并嘗試清理所有存儲(chǔ)的狀態(tài)信息。也可以在Storm UI上進(jìn)行操作。 - deactivate:
storm deactivate topology_name,用來(lái)通知Storm停止特定的topology的spout發(fā)送tuple,可以在Storm UI上取消激活操作。 - active:
storm activate topology_name,用來(lái)通知Storm重新回復(fù)指定的topology的spout發(fā)送tuple,可以在Storm UI上重新激活操作。 - rebalance:
storm rebalance topology_name [-w wait_time] [-n worker_count] [-e component_name=executer_count],只是Storm在集群的worker之間重新平均分派任務(wù),不需要關(guān)閉或重新提交現(xiàn)有topology。還可以通過(guò)-n或-e參數(shù)修改topology分配的worker數(shù)及每個(gè)task分配的executor數(shù)。當(dāng)執(zhí)行rebalance命令時(shí),Storm會(huì)先取消激活topology,等待配置的時(shí)間是剩余的tuple完成處理,然后在supervisor節(jié)點(diǎn)中均勻分配worker。重新平衡后,Storm會(huì)將topology重新激活。比如:等待15秒,指定5個(gè)worker,指定sentece-spout使用4個(gè)executor、split-bolt使用8個(gè)eexecutor,命令為:storm rebalance wordcount-topology -w 15 -n 5 -e sentence-spout=4 -e split-bolt=8。 - remoteconfvalue:
storm remoteconfvalue conf-name,用來(lái)查看集群中配置參數(shù)??梢钥吹秸麄€(gè)集群的公共配置,不能單獨(dú)查看topology中覆蓋的特殊配置。
個(gè)人主頁(yè): http://www.howardliu.cn
個(gè)人博文: storm筆記:storm集群
CSDN主頁(yè): http://blog.csdn.net/liuxinghao
CSDN博文: storm筆記:storm集群