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