這篇文章主要講解了“Storm數(shù)據(jù)流模型有哪些”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Storm數(shù)據(jù)流模型有哪些”吧!
龍城網(wǎng)站建設公司創(chuàng)新互聯(lián)建站,龍城網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為龍城上千多家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務好的龍城做網(wǎng)站的公司定做!
Storm 是一個開源的實時計算系統(tǒng),它提供了一系列的基本元素用于進行計算:
1 Topology
2 Stream
3 spout
4 bolt
在我們提交我們的topology的時候,一旦你提交了你的topology到你的集群之中后,除非你顯示的去停止任務
集群中間的topology會一直的在運行
計算任務Topology是由不同的Spouts 和 bolts,通過數(shù)據(jù)流 Stream連接起來的圖,下面是一個Topology的結(jié)構(gòu)示意圖
其中包括了
1 : Spout: Strom 中的消息源頭,用于為Topology來生產(chǎn)消息(數(shù)據(jù)),一般是從外部的數(shù)據(jù)源開始讀取數(shù)據(jù),在我們的真實環(huán)境之中,我們采用的是 kafka-Storm 流式對接的接口,所以我們 使用的Spout為 :kafkaSpout
2 Bolt, Storm中的消息處理者,用于為Topology 進行消息的處理,Bolt,可以執(zhí)行如下的幾種操作:
2.1 :過濾
2.2: 聚合
2.3: 查詢數(shù)據(jù)庫
等幾種操作,并且可以一級一級的進行處理,最終Topology會被提交到Storm集群中運行,也可以通過命令停止topology的運行,并且將占用的資源歸還給Storm集群。
Storm 數(shù)據(jù)流模型
數(shù)據(jù)流的模型是Storm中對數(shù)據(jù)進行的抽象,它是時間上無界的tuple的元祖,在topology之中,Spout是bolt的源頭,
bolt是對于Spout的消費者,負責Topology從特定數(shù)據(jù)源發(fā)射Stream,bolt可以接受任意多個Stream輸入,然后進行數(shù)據(jù)的加工處理工作,如果需要,bolt還可以發(fā)射出新的Stream給下一級Bolt進行處理
下面是一個Topology內(nèi)部Spout和Bolt之間的數(shù)據(jù)流關(guān)系:
topology中每一個計算組件(Spout和bolt) 都有一個并行度來控制,在創(chuàng)建Topology時可以進行指定,Storm在集群內(nèi)分配對應并行度個數(shù)的線程來同時執(zhí)行這一個組件
那么,有一個這樣的問題: 既然對于一個Spout,或Bolt,都會有多個task線程來運行,那么如何在兩個組件之間發(fā)送tuple 元祖了?
Storm 提供了好幾種數(shù)據(jù)流的分發(fā)策略用來解決這一個問題,在Topology定義的時,需要為每一個bolt指定接受什么樣的Stream作為它輸入
目前Storm中提供了一下的7種Stream Grouping
Shuffle Grouping、
Fields Grouping、
All Grouping、
Global Grouping、
Non Grouping、
Direct Grouping、
Local or shuffle grouping
一種Storm不能支持的場景
如果您閱讀到這里,那么您可以細細的回想起來,當我們每一個業(yè)務邏輯都被一個Topolo持有的時候,
只能在Topology內(nèi)按照 “發(fā)布-訂閱”方式在不同的計算組件(spout/bolt)之間進行數(shù)據(jù)的處理,而Stream在
Topology之間是無法流動的。
很多時候,開始需要把你所有的業(yè)務邏輯寫到你的一個Topology之中,請不要忘記:Stream在topology之間是無法流動的
也就是意味著一個業(yè)務邏輯的過程,不能夠和另外的一個業(yè)務過程進行通信
我們假設現(xiàn)在有這樣的一個Topology1,在整個Topology的過程之中,通過初步的 filter,join bolt,Business1
Bolt,其中,F(xiàn)ilter Bolt用于對數(shù)據(jù)的過濾,join Bolt用于數(shù)據(jù)流的聚合,如下圖所示:
目前這個Topology已經(jīng)被提交到集群了,那么,如果我們需要一個新的業(yè)務邏輯,而
這個Topology的特點是和Topology1 公用的數(shù)據(jù)源,而且前期的預處理過程是一樣的
那么這時候Storm 怎么滿足這一需求?
1 第一: kill掉原先的topology,然后實現(xiàn)bussiness Bolt的計算邏輯,并且重新打包形成一個新的
topology計算任務的jar 包后,提交到Storm集群之中重新運行,那么目前,我們的結(jié)構(gòu)圖如下所示:
這樣的過程之中,來自于不同數(shù)據(jù)源的處理過程,經(jīng)過處理以后,經(jīng)過join以后,被發(fā)送到兩個業(yè)務邏輯的處理Bolt之中。
第一種方式的缺陷:
Topology 需要重新來部署,并且狀態(tài)會丟失。而且需要修改你自身的topology結(jié)構(gòu),失去了穩(wěn)定性的保證
2:第二種方式:
同一份的數(shù)據(jù)源被被兩份處理流程所消費。無疑增加了External Data Source的負載壓力,而且會導致我們的發(fā)射數(shù)據(jù)在集群之中被傳輸兩份,一旦數(shù)據(jù)重復讀取的因子超過2,那么對Storm 的計算Slot的浪費很嚴重
3 第三種方式
ok,看了以上兩種方式以后,也許你會提出下面的解決方案,通過kafka這樣的消息中間件,來實現(xiàn)不同Topology的
Spout 共享數(shù)據(jù)源頭,而且這樣可以做到
3.1:【消息可靠傳輸】
3.2: 【消息rewind回傳等】
有關(guān)kafka-Storm的接入組件,請參考 【至靜】所寫的其他kafka有關(guān)的博文
對于消息中間件的引入,一方面減少了對減少對External Data Source的重復訪問壓力,而且通過消息中間件,我們屏蔽了External Data Sourcede 的重復訪問壓力
感謝各位的閱讀,以上就是“Storm數(shù)據(jù)流模型有哪些”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對Storm數(shù)據(jù)流模型有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!