Storm作為一個(gè)開(kāi)源的分布式實(shí)時(shí)流計(jì)算框架,其內(nèi)部實(shí)現(xiàn)使用了一些常用的技術(shù),這里是對(duì)這些技術(shù)及其在Storm中作用的概括介紹。以此為基礎(chǔ),后續(xù)再深入了解Storm的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。
1. Zookeeper集群
Zookeeper是一個(gè)針對(duì)大型分布式系統(tǒng)的可靠協(xié)調(diào)服務(wù)系統(tǒng),其采用類似Unix文件系統(tǒng)樹(shù)形層次結(jié)構(gòu)的數(shù)據(jù)模型(如:/zoo/a,/zoo/b),節(jié)點(diǎn)內(nèi)可存儲(chǔ)少量數(shù)據(jù)(<1M,當(dāng)節(jié)點(diǎn)存儲(chǔ)大數(shù)據(jù)量時(shí),實(shí)際應(yīng)用中可能出現(xiàn)同步問(wèn)題)。
Zookeepr的高可靠性服務(wù)是通過(guò)配置Zookeeper集群實(shí)現(xiàn)的,官方建議Zookeeper集群至少包含3個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)上存儲(chǔ)一份數(shù)據(jù),主節(jié)點(diǎn)掛掉后可以重新選取一個(gè)節(jié)點(diǎn)作為主節(jié)點(diǎn)。只要保證集群內(nèi)有一半以上的節(jié)點(diǎn)存活,集群就可對(duì)外提供服務(wù)。
Zookeeper支持的操作類型有:
(1)創(chuàng)建樹(shù)節(jié)點(diǎn)znode;
(2)刪除樹(shù)節(jié)點(diǎn)znode;
(3)讀取樹(shù)節(jié)點(diǎn)znode的內(nèi)容和其子節(jié)點(diǎn)的內(nèi)容;
(4)當(dāng)節(jié)點(diǎn)內(nèi)容發(fā)生變化或子節(jié)點(diǎn)增刪時(shí)觸發(fā)消息通知更新消息;
(5)支持瞬時(shí)節(jié)點(diǎn)(EPHEMERAL),創(chuàng)建節(jié)點(diǎn)的進(jìn)程退出后節(jié)點(diǎn)自動(dòng)被刪除。
Storm中使用Zookeeper主要用于Storm集群各節(jié)點(diǎn)的分布式協(xié)調(diào)工作,具體功能如下:
(1)存儲(chǔ)客戶端提供的topology任務(wù)信息,nimbus負(fù)責(zé)將任務(wù)分配信息寫入Zookeeper,supervisor從Zookeeper上讀取任務(wù)分配信息;
(2)存儲(chǔ)supervisor和worker的心跳(包括它們的狀態(tài)),使得nimbus可以監(jiān)控整個(gè)集群的狀態(tài), 從而重啟一些掛掉的worker;
(3)存儲(chǔ)整個(gè)集群的所有狀態(tài)信息和配置信息。
關(guān)于Storm在Zookeeper的詳細(xì)目錄結(jié)構(gòu),可參考這里。
2. Thrift服務(wù)框架
Thrift是一個(gè)跨語(yǔ)言的可擴(kuò)展的服務(wù)框架,它通過(guò)一個(gè)中間語(yǔ)言(IDL,接口定義語(yǔ)言)來(lái)定義RPC的接口和數(shù)據(jù)類型,然后通過(guò)一個(gè)編譯器生成RPC客戶端和服務(wù)器通信的無(wú)縫跨編程語(yǔ)言。
Storm中Thrift的應(yīng)用場(chǎng)景:
(1)客戶端向nimbus提交topology任務(wù);
(2)supervisor從nimbus下載topology任務(wù)(代碼和序列化文件);
(3)storm ui從nimbus獲取topology運(yùn)行的統(tǒng)計(jì)信息。
3. ZeroMQ消息隊(duì)列
ZeroMQ是一個(gè)基于消息的嵌入式網(wǎng)絡(luò)編程庫(kù),可作為并發(fā)框架連接多個(gè)應(yīng)用程序,支持N-to-N的連接,多種工作模式(Request-reply,Publish-subscribe,Pipeline等),支持多種語(yǔ)言,ZeroMQ使得編寫高性能網(wǎng)絡(luò)應(yīng)用程序極為簡(jiǎn)單。
Storm中ZeroMQ的應(yīng)用場(chǎng)景:Spout與Bolt、Bolt與Bolt之間tuple消息的傳輸。
4. Java序列化
Java序列化技術(shù)可以實(shí)現(xiàn)將Java對(duì)象保存為二進(jìn)制文件,而反序列化過(guò)程則可以在另一個(gè)Java進(jìn)程中將此二進(jìn)制文件恢復(fù)為Java對(duì)象,其缺點(diǎn)在于不能很好的解決版本變化。
Storm中Java序列化的應(yīng)用場(chǎng)景:
(1)客戶端提交topology任務(wù)后,Storm將topology任務(wù)序列化并發(fā)送給nimbus;
(2)supervisor從Zookeeper取得任務(wù)信息后,從nimbus下載序列化文件和jar包,啟動(dòng)worker進(jìn)程并反序列化得到提交任務(wù)時(shí)的topology對(duì)象。
5. 總結(jié)
以上只是對(duì)Storm中所使用到的Zookeeper集群、Thrift服務(wù)框架、ZeroMQ消息隊(duì)列、Java序列化技術(shù)及其在Storm中的應(yīng)用情況的簡(jiǎn)單介紹,后續(xù)再進(jìn)一步結(jié)合Storm的源碼進(jìn)行深入分析。以上內(nèi)容,如果不對(duì)之處,歡迎大家指正。