沈超 鄧彩鳳
(1.大慶油田工程建設有限公司化建公司,黑龍江大慶 163159;2.中國石油大港油田分公司對外合作項目部,天津 300280)
論Storm分布式實時計算工具
沈超1鄧彩鳳2
(1.大慶油田工程建設有限公司化建公司,黑龍江大慶 163159;2.中國石油大港油田分公司對外合作項目部,天津 300280)
互聯(lián)網(wǎng)的應用催生了一大批新的數(shù)據(jù)處理技術,storm分布式實時處理工具以其強大的數(shù)據(jù)處理能力、可靠性高、擴展性好等特點,在近幾年得到越來越廣泛的關注和應用。
分布式 實時計算 流處理
互聯(lián)網(wǎng)的應用正在越來越深入的改變?nèi)藗兊纳?,互?lián)網(wǎng)技術也在不斷發(fā)展,尤其是大數(shù)據(jù)處理技術,過去的十年是大數(shù)據(jù)處理技術變革的十年,MapReduce,Hadoop以及一些相關的技術使得我們能處理的數(shù)據(jù)量比以前要大得多得多。但是這些數(shù)據(jù)處理技術都不是實時的系統(tǒng),或者說,它們設計的目的也不是為了實時計算。沒有什么辦法可以簡單地把hadoop變成一個實時計算系統(tǒng)。實時數(shù)據(jù)處理系統(tǒng)和批量數(shù)據(jù)處理系統(tǒng)在需求上有著本質(zhì)的差別。
然而大規(guī)模的實時數(shù)據(jù)處理已經(jīng)越來越成為一種業(yè)務需求了,而缺少一個“實時版本的hadoop”已經(jīng)成為數(shù)據(jù)處理整個生態(tài)系統(tǒng)的一個巨大缺失。而storm的出現(xiàn)填補了這個缺失。Storm出現(xiàn)之前,互聯(lián)網(wǎng)技術人員可能需要自己手動維護一個由消息隊列和消息處理者所組成的實時處理網(wǎng)絡,消息處理者從消息隊列取出一個消息進行處理,更新數(shù)據(jù)庫,發(fā)送消息給其它隊列等等。不幸的是,這種方式有以下幾個缺陷:
單調(diào)乏味:技術人員花費了絕大部分開發(fā)時間去配置把消息發(fā)送到哪里,部署消息處理者,部署中間消息節(jié)點—設計者的大部分時間花在設計,配置這個數(shù)據(jù)處理框架上,而真正關心的消息處理邏輯在代碼里面占的比例很少。
脆弱:不夠健壯,設計者要自己寫代碼保證所有的消息處理者和消息隊列正常運行。
伸縮性差:當一個消息處理者的消息量達到閥值,需要對這些數(shù)據(jù)進行分流,配置這些新的處理者以讓他們處理分流的消息。
Storm定義了一批實時計算的原語。如同hadoop大大簡化了并行批量數(shù)據(jù)處理,storm的這些原語大大簡化了并行實時數(shù)據(jù)處理。storm的一些關鍵特性如下:
適用場景廣泛:storm可以用來處理消息和更新數(shù)據(jù)庫(消息流處理),對一個數(shù)據(jù)量進行持續(xù)的查詢并返回客戶端(持續(xù)計算),對一個耗資源的查詢作實時并行化的處理(分布式方法調(diào)用),storm的這些基礎原語可以滿足大量的場景。
可伸縮性高:Storm的可伸縮性可以讓storm每秒可以處理的消息量達到很高。Storm使用ZooKeeper來協(xié)調(diào)集群內(nèi)的各種配置使得Storm的集群可以很容易的擴展很大。
保證無數(shù)據(jù)丟失:實時系統(tǒng)必須保證所有的數(shù)據(jù)被成功的處理。那些會丟失數(shù)據(jù)的系統(tǒng)的適用場景非常窄,而storm保證每一條消息都會被處理,這一點和S4相比有巨大的反差。
異常健壯:不像Hadoop—出了名的難管理,storm集群非常容易管理。容易管理是storm的設計目標之一。
語言無關性:健壯性和可伸縮性不應該局限于一個平臺。Storm的topology和消息處理組件可以用任何語言來定義,這一點使得任何人都可以使用storm。
計算拓補:Topologies
一個實時計算應用程序的邏輯在storm里面被封裝到topology對象里面,我把它叫做計算拓補。Storm里面的topology相當于Hadoop里面的一個MapReduce Job,它們的關鍵區(qū)別是:一個MapReduce Job最終總是會結束的,然而一個storm的topoloy會一直運行—除非你顯式的殺死它。一個Topology是Spouts和Bolts組成的圖狀結構,而鏈接Spouts和Bolts的則是Streamgroupings。
消息流:Streams
消息流是storm里面的最關鍵的抽象。一個消息流是一個沒有邊界的tuple序列,而這些tuples會被以一種分布式的方式并行地創(chuàng)建和處理。對消息流的定義主要是對消息流里面的tuple的定義,我們會給tuple里的每個字段一個名字。并且不同tuple的對應字段的類型必須一樣。也就是說:兩個tuple的第一個字段的類型必須一樣,第二個字段的類型必須一樣,但是第一個字段和第二個字段可以有不同的類型。在默認的情況下,tuple的字段類型可以是:integer,long,short,byte,string,double,float,boolean和bytearray。你還可以自定義類型—只要你實現(xiàn)對應的序列化器。
根據(jù)storm的特點,大致有兩個應用模式:(1)實時流處理;(2)drpc調(diào)用;前者就是通過消息隊列等方式將數(shù)據(jù)源源不斷的發(fā)送給storm集群來處理,而后者,類似于開啟一個服務,客戶端方面可以遠程的發(fā)送數(shù)據(jù)給storm并同步或異步的接收到處理結果。
storm的應用場景非常廣泛,具體如下:
監(jiān)控系統(tǒng):監(jiān)控整個集群的狀態(tài),當出現(xiàn)異常log的時候進行分析,對異常進行分類并實時發(fā)出報警,提示運維人員來維護。并且可以進一步考慮。這樣可以對整個系統(tǒng)的做一個很好的監(jiān)控和反應。
安全系統(tǒng):在信息安全領域中,做實時的流量分析,異常過濾、惡意攻擊檢測等。
實時計算:根據(jù)之前數(shù)據(jù)分析人員分析計算的數(shù)學模型,如點擊量預估模型、用戶付費預期計算模型、好友推薦算法,放到storm的拓撲中,通過topology來計算,可以幫助實時為用戶提供服務、及時發(fā)現(xiàn)問題、極大的提高工作效率,而不必受制于老的計算模式,如一天計算一次、一小時計算一次等。
Storm0.7系列的版本已經(jīng)在各大公司得到了廣泛使用,最近發(fā)布的0.8版本中引入了State,使得其從一個純計算框架演變成了一個包含存儲和計算的實時計算新利器,還有剛才提到的Trident,提供更加友好的接口,同時可定制scheduler的特性也為其針對不同的應用場景做優(yōu)化提供了更便利的手段,也有人已經(jīng)在基于storm的實時ql(query language)上邁出了腳本。在服務化方面,storm一直在朝著融入mesos框架的方向努力。同時,storm也在實現(xiàn)細節(jié)上不斷地優(yōu)化,使用很多優(yōu)秀的開源產(chǎn)品,包括kryo,Disruptor,curator等等??梢韵胂?,當storm發(fā)展到1.0版本時,一定是一款無比杰出的產(chǎn)品。