Strom集群結(jié)構(gòu)是有一個(gè)主節(jié)點(diǎn)(nimbus)和多個(gè)工作節(jié)點(diǎn)(supervisor)組成的主從結(jié)構(gòu),主節(jié)點(diǎn)通過配置靜態(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ī)避這種風(fēng)險(xiǎn)朗伶,后面將解釋Storm的半容錯(cuò)結(jié)構(gòu)。
nimbus與supervisor都是Storm提供的后臺(tái)守護(hù)進(jìn)程益楼,之間的通信是結(jié)合Zookeeper的狀態(tài)變更通知和監(jiān)控通知來處理感凤。如下圖所示:
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來執(zhí)行指定task鱼响。
nimbus通過Zookeeper記錄所有supervisor節(jié)點(diǎn)的狀態(tài)和分配給它們的task。如果nimbus發(fā)現(xiàn)某個(gè)supervisor沒有上報(bào)心跳或已經(jīng)不可達(dá)债鸡,它將會(huì)把分配給故障supervisor的task重新分配給其他節(jié)點(diǎn)厌均。
嚴(yán)格來講棺弊,nimbus不會(huì)出現(xiàn)單點(diǎn)故障模她。這個(gè)特性是因?yàn)閚imbus進(jìn)程不參與topology(拓?fù)洌┑臄?shù)據(jù)處理過程懂牧,僅僅是管理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)單的偽分布式模式,其部署過程分為下面幾步:
- 部署Zookeeper集群
- 在nimbus檬贰、supervisor節(jié)點(diǎn)上安裝依賴
- 下載定解壓storm的執(zhí)行包到nimbus桥言、supervisor機(jī)器上(使用直接使用tar命令進(jìn)行解壓即可)
- 在storm.yaml配置必填項(xiàng)
- 通過
storm
命令啟動(dòng)進(jìn)程
Zookeeper集群
關(guān)于Zookeeper集群的部署葵礼,可以查看ZooKeeper安裝部署或A Guide to Deployment and Administration鸳粉。
安裝依賴
在nimbus届谈、supervisor所在的機(jī)器上安裝依賴艰山,主要包括java和python曙搬,當(dāng)前版本java最低使用jdk6,因?yàn)閜ython2和3版本不兼容征讲,官方推薦使用Python2.6.6诗箍。
下載解壓
wget或culr直接從這里下載壓縮包,通過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集群沒有是用默認(rèn)的端口號(hào)8080糙俗,使用
storm.zookeeper.port
修改配置,比如:storm.zookeeper.port: 9999
预鬓。 - storm.local.dir:nimbus與supervisor守護(hù)進(jìn)程需要一個(gè)文件夾來存儲(chǔ)少量的狀態(tài)數(shù)據(jù)(比如jar包巧骚、配置等)。該配置決定了nimbus和supervisor將信息存儲(chǔ)在哪。該目錄必須存在劈彪,且對(duì)當(dāng)前用戶有適當(dāng)?shù)牟僮鳈?quán)限竣蹦,這個(gè)目錄的內(nèi)容必須在集群運(yùn)行的過程中一直存在,所以避免在/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)聽端口,每個(gè)worker使用單獨(dú)的監(jiān)聽端口,這樣,端口個(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的所有配置都可以通過前綴區(qū)分作用域,如下表所示:
前綴 | 分類 |
---|---|
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是快速失敗的模式勃刨,也就是說,進(jìn)程遇到任何意外情況早敬,都會(huì)立即停止。Storm被設(shè)計(jì)成能夠安全退成秤标、快速回復(fù)的無狀態(tài)進(jìn)程衙猪。如果nimbus或supervisor重啟了撑瞧,不會(huì)對(duì)運(yùn)行中的topology產(chǎn)生任何影響扭屁。
可執(zhí)行程序
Storm提供了多用途的命令行程序葵腹,可以用來啟動(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踏烙,可以通過瀏覽器訪問寡夹。
管理命令
Storm的管理命令用來發(fā)布和管理集群的topology,通常需要在Storm集群外的工作站執(zhí)行挣惰,管理命令從~/.storm/storm.yaml
文件中查找nimbus主機(jī)名赏枚,比如:
nimbus.host: "nimbus"
- jar:
storm jar topology_jar topology_class [arguments...]
磕秤,用來向Storm提交topology,會(huì)上傳topology_jar文件到nimbus并分發(fā)到整個(gè)集群,使用指定topology_class中的main方法。提交完成后贮尉,Storm會(huì)激活并開始運(yùn)行topology览芳。main方法中需要有StormSubmitter.submitTopology
方法,并需要有一個(gè)唯一的topology名,如果集群中有同名的topology,jar命令會(huì)執(zhí)行失敗右钾。 - kill:
storm kill topology_name [-w wait_time]
舀射,用來關(guān)閉已經(jīng)部署的topology邢羔。該命令通過topology_name來關(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
,用來通知Storm停止特定的topology的spout發(fā)送tuple舍肠,可以在Storm UI上取消激活操作搀继。 - active:
storm activate topology_name
,用來通知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点骑。還可以通過-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
,用來查看集群中配置參數(shù)济舆∏湓螅可以看到整個(gè)集群的公共配置,不能單獨(dú)查看topology中覆蓋的特殊配置滋觉。
個(gè)人主頁: http://www.howardliu.cn
個(gè)人博文: storm筆記:storm集群
CSDN主頁: http://blog.csdn.net/liuxinghao
CSDN博文: storm筆記:storm集群