Storm分布式實(shí)時(shí)大數(shù)據(jù)處理框架
1.什么是Storm
Storm是Twitter開源的分布式實(shí)時(shí)大數(shù)據(jù)處理框架,被業(yè)界稱為實(shí)時(shí)版Hadoop。隨著越來(lái)越多的場(chǎng)景對(duì)Hadoop的MapReduce高延遲無(wú)法容忍,比如網(wǎng)站統(tǒng)計(jì)、推薦系統(tǒng)、預(yù)警系統(tǒng)、金融系統(tǒng)(高頻交易、股票)等等,大數(shù)據(jù)實(shí)時(shí)處理解決方案(流計(jì)算)的應(yīng)用日趨廣泛,目前已是分布式技術(shù)領(lǐng)域最新爆發(fā)點(diǎn),而Storm更是流計(jì)算技術(shù)中的佼佼者和主流。
按照storm作者的說(shuō)法,Storm對(duì)于實(shí)時(shí)計(jì)算的意義類似于Hadoop對(duì)于批處理的意義。Hadoop提供了map、reduce原語(yǔ),使我們的批處理程序變得簡(jiǎn)單和高效。同樣,Storm也為實(shí)時(shí)計(jì)算提供了一些簡(jiǎn)單高效的原語(yǔ),而且Storm的Trident是基于Storm原語(yǔ)更高級(jí)的抽象框架,類似于基于Hadoop的Pig框架,讓開發(fā)更加便利和高效。
2.Storm應(yīng)用場(chǎng)景
推薦系統(tǒng)(實(shí)時(shí)推薦,根據(jù)下單或加入購(gòu)物車推薦相關(guān)商品)、金融系統(tǒng)、預(yù)警系統(tǒng)、網(wǎng)站統(tǒng)計(jì)(實(shí)時(shí)銷量、流量統(tǒng)計(jì),如淘寶雙11效果圖)、交通路況實(shí)時(shí)系統(tǒng)等等。
3.Storm的一些特性
1.適用場(chǎng)景廣泛: storm可以實(shí)時(shí)處理消息和更新DB,對(duì)一個(gè)數(shù)據(jù)量進(jìn)行持續(xù)的查詢并返回客戶端(持續(xù)計(jì)算),對(duì)一個(gè)耗資源的查詢作實(shí)時(shí)并行化的處理(分布式方法調(diào)用,即DRPC),storm的這些基礎(chǔ)API可以滿足大量的場(chǎng)景。
2. 可伸縮性高: Storm的可伸縮性可以讓storm每秒可以處理的消息量達(dá)到很高。擴(kuò)展一個(gè)實(shí)時(shí)計(jì)算任務(wù),你所需要做的就是加機(jī)器并且提高這個(gè)計(jì)算任務(wù)的并行度 。Storm使用ZooKeeper來(lái)協(xié)調(diào)集群內(nèi)的各種配置使得Storm的集群可以很容易的擴(kuò)展。
3. 保證無(wú)數(shù)據(jù)丟失: 實(shí)時(shí)系統(tǒng)必須保證所有的數(shù)據(jù)被成功的處理。 那些會(huì)丟失數(shù)據(jù)的系統(tǒng)的適用場(chǎng)景非常窄, 而storm保證每一條消息都會(huì)被處理, 這一點(diǎn)和S4相比有巨大的反差。
4. 異常健壯: storm集群非常容易管理,輪流重啟節(jié)點(diǎn)不影響應(yīng)用。
5. 容錯(cuò)性好:在消息處理過(guò)程中出現(xiàn)異常, storm會(huì)進(jìn)行重試
6. 語(yǔ)言無(wú)關(guān)性: Storm的topology和消息處理組件(Bolt)可以用任何語(yǔ)言來(lái)定義, 這一點(diǎn)使得任何人都可以使用storm.
4.storm集群結(jié)構(gòu)
Nimbus 和Supervisors 之間所有的協(xié)調(diào)工作是通過(guò) 一個(gè)Zookeeper 集群。
Nimbus進(jìn)程和 Supervisors 進(jìn)程是無(wú)法直接連接,并且是無(wú)狀態(tài)的; 所有的狀態(tài)維持在Zookeeper中或保存在本地磁盤上。
意味著你可以 kill -9 Nimbus 或Supervisors 進(jìn)程,而不需要做備份。
這種設(shè)計(jì)導(dǎo)致storm集群具有令人難以置信的穩(wěn)定性,并且無(wú)耦合。
5.storm工作原理
Nimbus 負(fù)責(zé)在集群分發(fā)的代碼,topo只能在nimbus機(jī)器上提交,將任務(wù)分配給其他機(jī)器,和故障監(jiān)測(cè)。
Supervisor,監(jiān)聽分配給它的節(jié)點(diǎn),根據(jù)Nimbus 的委派在必要時(shí)啟動(dòng)和關(guān)閉工作進(jìn)程。 每個(gè)工作進(jìn)程執(zhí)行topology 的一個(gè)子集。一個(gè)運(yùn)行中的topology 由很多運(yùn)行在很多機(jī)器上的工作進(jìn)程組成。
在Storm中有對(duì)于流stream的抽象,流是一個(gè)不間斷的無(wú)界的連續(xù)tuple,注意Storm在建模事件流時(shí),把流中的事件抽象為tuple即元組
Storm認(rèn)為每個(gè)stream都有一個(gè)源,也就是原始元組的源頭,叫做Spout(管口)
處理stream內(nèi)的tuple,抽象為Bolt,bolt可以消費(fèi)任意數(shù)量的輸入流,只要將流方向?qū)蛟揵olt,同時(shí)它也可以發(fā)送新的流給其他bolt使用,這樣一來(lái),只要打開特定的spout再將spout中流出的tuple導(dǎo)向特定的bolt,bolt又對(duì)導(dǎo)入的流做處理后再導(dǎo)向其他bolt或者目的地。
可以認(rèn)為spout就是水龍頭,并且每個(gè)水龍頭里流出的水是不同的,我們想拿到哪種水就擰開哪個(gè)水龍頭,然后使用管道將水龍頭的水導(dǎo)向到一個(gè)水處理器(bolt),水處理器處理后再使用管道導(dǎo)向另一個(gè)處理器或者存入容器中。
為了增大水處理效率,我們很自然就想到在同個(gè)水源處接上多個(gè)水龍頭并使用多個(gè)水處理器,這樣就可以提高效率。
這是一張有向無(wú)環(huán)圖,Storm將這個(gè)圖抽象為Topology(拓?fù)?,Topo就是storm的Job抽象概念,一個(gè)拓?fù)渚褪且粋€(gè)流轉(zhuǎn)換圖
圖中每個(gè)節(jié)點(diǎn)是一個(gè)spout或者bolt,每個(gè)spout或者bolt發(fā)送元組到下一級(jí)組件。
而Spout到單個(gè)Bolt有6種流分組策略。
6.Topology
Storm將流中元素抽象為tuple,一個(gè)tuple就是一個(gè)值列表value list,list中的每個(gè)value可以是任意可序列化的類型。拓?fù)涞拿總€(gè)節(jié)點(diǎn)都要說(shuō)明它所發(fā)射出的元組的字段的name,其他節(jié)點(diǎn)只需要訂閱該name就可以接收處理。
7.storm相關(guān)概念
Streams:消息流
消息流是一個(gè)沒有邊界的tuple序列,而這些tuples會(huì)被以一種分布式的方式并行創(chuàng)建和處理。 每個(gè)tuple可以包含多列,字段類型可以是: integer, long, short, byte, string, double, float, boolean和byte array。 你還可以自定義類型 — 只要你實(shí)現(xiàn)對(duì)應(yīng)的序列化器。
Spouts:消息源
Spouts是topology消息生產(chǎn)者。Spout從一個(gè)外部源(消息隊(duì)列)讀取數(shù)據(jù)向topology發(fā)出tuple。 消息源Spouts可以是可靠的也可以是不可靠的。一個(gè)可靠的消息源可以重新發(fā)射一個(gè)處理失敗的tuple, 一個(gè)不可靠的消息源Spouts不會(huì)。
Spout類的方法nextTuple不斷發(fā)射tuple到topology,storm在檢測(cè)到一個(gè)tuple被整個(gè)topology成功處理的時(shí)候調(diào)用ack, 否則調(diào)用fail。
storm只對(duì)可靠的spout調(diào)用ack和fail。
Bolts:消息處理者
消息處理邏輯被封裝在bolts里面,Bolts可以做很多事情: 過(guò)濾, 聚合, 查詢數(shù)據(jù)庫(kù)等。
Bolts可以簡(jiǎn)單的做消息流的傳遞。復(fù)雜的消息流處理往往需要很多步驟, 從而也就需要經(jīng)過(guò)很多Bolts。第一級(jí)Bolt的輸出可以作為下一級(jí)Bolt的輸入。而Spout不能有一級(jí)。
Bolts的主要方法是execute(死循環(huán))連續(xù)處理傳入的tuple,成功處理完每一個(gè)tuple調(diào)用OutputCollector的ack方法,以通知storm這個(gè)tuple被處理完成了。當(dāng)處理失敗時(shí),可以調(diào)fail方法通知Spout端可以重新發(fā)送該tuple。
流程是: Bolts處理一個(gè)輸入tuple, 然后調(diào)用ack通知storm自己已經(jīng)處理過(guò)這個(gè)tuple了。storm提供了一個(gè)IBasicBolt會(huì)自動(dòng)調(diào)用ack。
Bolts使用OutputCollector來(lái)發(fā)射tuple到下一級(jí)Blot。