Storm编程模型总结
- 目錄
- 前言:
- 1、Storm編程模型
- 2、對(duì)應(yīng)的的WordCount案例
- 總結(jié):
目錄
前言:
對(duì)于Storm的編程模型有必要做一個(gè)詳細(xì)的介紹(配合WC案例來介紹)
1、Storm編程模型
上圖中組件的解釋:
DataSource:外部數(shù)據(jù)源
Spout:接受外部數(shù)據(jù)源的組件,將外部數(shù)據(jù)源轉(zhuǎn)化成Storm內(nèi)部的數(shù)據(jù),以Tuple為基本的傳輸單元下發(fā)給Bolt
Bolt:接受Spout發(fā)送的數(shù)據(jù),或上游的bolt的發(fā)送的數(shù)據(jù)。根據(jù)業(yè)務(wù)邏輯進(jìn)行處理。發(fā)送給下一個(gè)Bolt或者是存儲(chǔ)到某種介質(zhì)上。介質(zhì)可以是Redis可以是mysql,或者其他。
Tuple:Storm內(nèi)部中數(shù)據(jù)傳輸?shù)幕締卧?#xff0c;里面封裝了一個(gè)List對(duì)象,用來保存數(shù)據(jù)。
StreamGrouping:數(shù)據(jù)分組策略
7種:shuffleGrouping(Random函數(shù)),Non Grouping(Random函數(shù)),FieldGrouping(Hash取模)、Local or ShuffleGrouping 本地或隨機(jī),優(yōu)先本地。
- Shuffle Grouping: 隨機(jī)分組, 隨機(jī)派發(fā)stream里面的tuple,保證每個(gè)bolt接收到的tuple數(shù)目大致相同。
- FieldsGrouping:按字段分組,比如按userid來分組,具有同樣userid的tuple會(huì)被分到相同的Bolts里的一個(gè)task,而不同的userid則會(huì)被分配到不同的bolts里的task。
- All Grouping:廣播發(fā)送,對(duì)于每一個(gè)tuple,所有的bolts都會(huì)收到。
- Global Grouping:全局分組,這個(gè)tuple被分配到storm中的一個(gè)bolt的其中一個(gè)task。再具體一點(diǎn)就是分配給id值最低的那個(gè)task。
- Non Grouping:不分組,這stream grouping個(gè)分組的意思是說stream不關(guān)心到底誰(shuí)會(huì)收到它的tuple。目前這種分組和Shuffle
grouping是一樣的效果, 有一點(diǎn)不同的是storm會(huì)把這個(gè)bolt放到這個(gè)bolt的訂閱者同一個(gè)線程里面去執(zhí)行。 - Direct Grouping: 直接分組,這是一種比較特別的分組方法,用這種分組意味著消息的發(fā)送者指定由消息接收者的哪個(gè)task處理這個(gè)消息。只有被聲明為Direct Stream的消息流可以聲明這種分組方法。而且這種消息tuple必須使用emitDirect方法來發(fā)射。消息處理者可以通過TopologyContext來獲取處理它的消息的task的id(OutputCollector.emit方法也會(huì)返回task的id)。
- Local or shuffle grouping:如果目標(biāo)bolt有一個(gè)或者多個(gè)task在同一個(gè)工作進(jìn)程中,tuple將會(huì)被隨機(jī)發(fā)生給這些tasks。否則,和普通的Shuffle Grouping行為一致。
FieldGrouping和shuffleGrouping 運(yùn)行過程分析:
FieldsGroup:你會(huì)發(fā)現(xiàn)相同的數(shù)據(jù)被分到相同的線程中。 95 word:am 95 word:am 95 word:am 95 word:am 95 word:am 91 word:love 91 word:love 91 word:love 91 word:love 91 word:love 95 word:am 89 word:i 89 word:hanmeimei 89 word:i 89 word:hanmeimei 89 word:i 93 word:lilei 93 word:lilei 93 word:lilei 93 word:lilei----------------------------------- shuffleGroup:你會(huì)發(fā)現(xiàn)相同的數(shù)據(jù)被分到不同的線程中(數(shù)字代表線程id) 95 word:hanmeimei 89 word:love 95 word:hanmeimei 89 word:am 95 word:am 89 word:love 89 word:love 89 word:hanmeimei 89 word:am 95 word:love 95 word:hanmeimei 89 word:i 95 word:am 95 word:i 95 word:hanmeimei 95 word:i 95 word:hanmeimei 89 word:am 95 word:love 89 word:love 95 word:love2、對(duì)應(yīng)的的WordCount案例
2.1、功能說明
設(shè)計(jì)一個(gè)topology,來實(shí)現(xiàn)對(duì)文檔里面的單詞出現(xiàn)的頻率進(jìn)行統(tǒng)計(jì)。
整個(gè)topology分為三個(gè)部分:
- RandomSentenceSpout:數(shù)據(jù)源,在已知的英文句子中,隨機(jī)發(fā)送一條句子出去。
- SplitSentenceBolt:負(fù)責(zé)將單行文本記錄(句子)切分成單詞
- WordCountBolt:負(fù)責(zé)對(duì)單詞的頻率進(jìn)行累加
執(zhí)行wc時(shí),通過Spout來讀取數(shù)據(jù),然后通過Bolt來切分?jǐn)?shù)據(jù)(如map階段)再通過另一個(gè)Bolt和上一個(gè)Bolt相連來進(jìn)一步做單詞的統(tǒng)計(jì)(通過hashmap來實(shí)現(xiàn))
2.2、項(xiàng)目主要流程
首先new TopologyBuilder->setSpout(spot的id,new spot的實(shí)現(xiàn)類,并發(fā)度)->setBolt(Bolt的id,new Bolt的實(shí)現(xiàn)類,并發(fā)度)<可設(shè)置多個(gè)Bolt>->new Config->config設(shè)置worker的數(shù)量。
2.3、RandomSentenceSpout的實(shí)現(xiàn)及生命周期
Spout的生命周期:open(初始化)->nextTuple(框架一直調(diào)用)->declareOutputFields(該方法用于聲明自己發(fā)射出去的數(shù)據(jù)的類型(自定義或者可以理解為標(biāo)識(shí)自己發(fā)射出去的數(shù)據(jù)))
2.4、SplitSentenceBolt的實(shí)現(xiàn)及生命周期
Bolt的生命周期:prepare(初始化)->execute(對(duì)傳過來的tuple進(jìn)行處理)->declareOutoutFields(聲明輸出的數(shù)據(jù)類型若輸出數(shù)據(jù)類型為多個(gè)則聲明多個(gè)如下圖所示(自定義))
2.5、WordCountBolt的實(shí)現(xiàn)及生命周期
代碼執(zhí)行圖:
總結(jié):
這篇文章最主要的目的還是讓讀者能夠?qū)torm的編程模型有個(gè)初步的認(rèn)識(shí);至少你得能夠看懂簡(jiǎn)單的WC案例,知道里面各個(gè)參數(shù)的含義,以及整個(gè)程序的執(zhí)行流程。
總結(jié)
以上是生活随笔為你收集整理的Storm编程模型总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 异常检测算法之IForest
- 下一篇: 乌班图Linux于windows系统怎么