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