Storm架构和编程模型总结
1. 編程模型
   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ì)象,用來(lái)保存數(shù)據(jù)。
   StreamGrouping:數(shù)據(jù)分組策略
 7種:shuffleGrouping(Random函數(shù)),Non Grouping(Random函數(shù)),FieldGrouping(Hash取模)、Local or ShuffleGrouping 本地或隨機(jī),優(yōu)先本地。
2. 并發(fā)度
   用戶指定的一個(gè)任務(wù),可以被多個(gè)線程執(zhí)行,并發(fā)度的數(shù)量等于線程的數(shù)量。一個(gè)任務(wù)的多個(gè)線程,會(huì)被運(yùn)行在多個(gè)Worker(JVM)上,有一種類似于平均算法的負(fù)載均衡策略。盡可能減少網(wǎng)絡(luò)IO,和Hadoop中的MapReduce中的本地計(jì)算的道理一樣。
3. 架構(gòu)
   Nimbus:任務(wù)分配
   Supervisor:接受任務(wù),并啟動(dòng)worker。worker的數(shù)量根據(jù)端口號(hào)來(lái)的。
   Worker:執(zhí)行任務(wù)的具體組件(其實(shí)就是一個(gè)JVM),可以執(zhí)行兩種類型的任務(wù),Spout任務(wù)或者bolt任務(wù)。
   Task:Task=線程=executor。 一個(gè)Task屬于一個(gè)Spout或者Bolt并發(fā)任務(wù)。
   Zookeeper:保存任務(wù)分配的信息、心跳信息、元數(shù)據(jù)信息。
4. Worker與topology
   一個(gè)worker只屬于一個(gè)topology,每個(gè)worker中運(yùn)行的task只能屬于這個(gè)topology。 反之,一個(gè)topology包含多個(gè)worker,其實(shí)就是這個(gè)topology運(yùn)行在多個(gè)worker上。
   一個(gè)topology要求的worker數(shù)量如果不被滿足,集群在任務(wù)分配時(shí),根據(jù)現(xiàn)有的worker先運(yùn)行topology。如果當(dāng)前集群中worker數(shù)量為0,那么最新提交的topology將只會(huì)被標(biāo)識(shí)active,不會(huì)運(yùn)行,只有當(dāng)集群有了空閑資源之后,才會(huì)被運(yùn)行。
5. 如何指定驅(qū)動(dòng)類中每個(gè)組件的并發(fā)度數(shù)量?如何設(shè)置worker的數(shù)量?
   (1)?根據(jù)上游的數(shù)據(jù)量來(lái)設(shè)置Spout的并發(fā)度。
  (2)?根據(jù)業(yè)務(wù)復(fù)雜度和execute方法執(zhí)行時(shí)間來(lái)設(shè)置Bolt并發(fā)度。
  (3) 根據(jù)集群的可用資源來(lái)配置,一般情況下70%的資源使用率。
? ? (4) Worker的數(shù)量理論上根據(jù)程序并發(fā)度總的Task數(shù)量來(lái)均分,在實(shí)際的業(yè)務(wù)場(chǎng)景中,需要反復(fù)調(diào)整
6.?Ack-fail機(jī)制
  (1) 需要ack-fail時(shí),請(qǐng)為每個(gè)tuple生成一個(gè)messageID,這個(gè)messagetId是用來(lái)標(biāo)識(shí)你關(guān)心的tuple。當(dāng)這個(gè)tuple被完全處理時(shí),storm框架會(huì)調(diào)用Spout的ack方法,否則調(diào)用fail。至于你的消息是否重發(fā),完全由自己處理。
?
(2)?在Spout有并發(fā)度的情況下,storm會(huì)根據(jù)tuple最開(kāi)始的所屬的spout taskId,通知相應(yīng)的spoutTask
   ?(3) 在流式計(jì)算中topology的bolt組件是可以配置多個(gè)的,在每個(gè)環(huán)節(jié)中,都需要bolt組件顯式告訴storm框架,自己對(duì)當(dāng)前接受的這個(gè)tuple處理完成。
 <spoutTaskId,<RootID,ackaValue=0>>
(4)?ack機(jī)制里面,發(fā)送兩種類型的tuple。一種是原始消息(DataTuple),另外一種是ackTuple<RootID,tupleID>,DataTuple中會(huì)包含一個(gè)MessageId的對(duì)象,
spout.emit(DataTuple(MessageId(ackTuple)))------->bolt1.execute(dataTuple)---->collector.ack(dataTuple) ackTuple--------------------->Acker.execute(tuple) dataTuple--->MessageId--->ackTuple Acker.execute(tuple)?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/sunfie/p/7268199.html
總結(jié)
以上是生活随笔為你收集整理的Storm架构和编程模型总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: Centos6.8上httpd配置腾讯云
- 下一篇: NoSQL分布式数据库的独家见解- Ad
