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