此頁面列舉了Storm的主要概念和資源連接。討論的概念有:
- 拓?fù)洌═opologies)
- 流(Streams)
- Spouts
- Bolts
- 流分組(Stream groupings)
- 可靠性(Reliability)
- 任務(wù)(Tasks)
- Workers
拓?fù)?/h2>
實(shí)時(shí)應(yīng)用程序的邏輯被打包進(jìn)一個(gè)Storm拓?fù)洹R粋€(gè)Storm拓?fù)漕愃朴贛apReduce作業(yè)。一個(gè)主要的差異是MapReduce作業(yè)最終會(huì)執(zhí)行完成,而一個(gè)拓?fù)溆谰眠\(yùn)行(知道你殺死它)。一個(gè)拓?fù)涫且粋€(gè)spouts和bolts組成的圖連接著流分組。這些概念下面講述。
資源:
- TopologyBuilder:在java中使用此類構(gòu)建拓?fù)洹?/li>
- 在集群中運(yùn)行拓?fù)?/a>
- 本地模式:如何在本地開發(fā)和測(cè)試拓?fù)?/li>
流
流是Strom的核心抽象。流是一個(gè)無界的元組序列,在分布式下被處理和創(chuàng)建。流的模式名稱字段中定義流的元組。默認(rèn)情況下,元組可以包含整形,長(zhǎng)整型,短整型,字節(jié),字符串,浮點(diǎn)型,bool,按字節(jié)數(shù)組。你也可以定義自己的序列化器使得自定義類型可以再tuples中使用。
每個(gè)流在聲明的時(shí)候都要給定一個(gè)id。由于單個(gè)流spouts和bolts是如此常見, OutputFieldsDeclarer提供了便捷的方法聲明一個(gè)留而不需設(shè)置Id,這種情況下,流的id默認(rèn)值為default
。
資源:
- Tuple:流是由元組組成。
- OutputFieldsDeclarer:用來聲明流和模式
- Serialization:關(guān)于Storm的動(dòng)態(tài)元組類型和自定義序列化的信息
Spouts
一個(gè)Spouts是拓?fù)渲辛鞯脑?。通常spouts從外部源中讀取元組并把他們發(fā)送到拓?fù)渲?。Spouts可以是可靠的或者不可靠的。一個(gè)可靠的spout可以在storm處理失敗的時(shí)候重放元組,不可靠的spout發(fā)送晚了元組就不管了。
Spouts可以發(fā)送到多個(gè)流。這么做,需要使用OutputFieldsDeclarer的declareStream
方法聲明多個(gè)流并且在使用 SpoutOutputCollector中的emit
方法時(shí)指定流。
spouts的主要方法是nextTuple
。nextTuple
發(fā)送一個(gè)新的元組到拓?fù)渲谢蛘咴跊]有新的元組時(shí)直接返回。nextTuple
不阻塞所有spout的實(shí)現(xiàn),因?yàn)镾torm在同一現(xiàn)成中調(diào)用所有的spout方法。
spouts的其他重要的方法有ack
和fail
。當(dāng)Storm檢測(cè)到元組發(fā)送成功或者失敗的時(shí)候調(diào)用。ack
和fail
只在可靠的spouts中有效,更多查看the Javadoc。
資源:
- IRichSpout:這是spouts必須實(shí)現(xiàn)的接口
- 保證消息處理
Bolts
拓?fù)渲械乃械奶幚矶荚赽olts中完成。Bolts可以做任何事,過濾,函數(shù),聚合,連接,和數(shù)據(jù)庫交互等等。
Bolts可以做簡(jiǎn)單的stream轉(zhuǎn)換。復(fù)雜的流轉(zhuǎn)換通常需要多步多個(gè)bolts。例如,
Bolts可以發(fā)送到多個(gè)流。這么做,需要使用OutputFieldsDeclarer的declareStream
方法聲明多個(gè)流并且在使用 SpoutOutputCollector中的emit
方法時(shí)指定流。
當(dāng)你聲明了一個(gè)bolt輸入流,通常訂閱到其他組件指定流上。如果你想要另外一個(gè)組件的所有流,你必須逐個(gè)訂閱。 InputDeclarer有愈發(fā)同訂閱流聲明了默認(rèn)的stream id。declarer.shuffleGrouping("1")
訂閱到組件1的默認(rèn)留中等價(jià)于declarer.shuffleGrouping("1", DEFAULT_STREAM_ID)
。
bolts的主要方法是execute
接受一個(gè)元組作為輸入。Bolts使用OutputCollector對(duì)象發(fā)送新的元組。Bolts處理每個(gè)元組時(shí)必須調(diào)用OutputCollector 的ack
方法,使得Storm知道元組完成了(并最終決定發(fā)送ack到原始的spout元組)。處理一個(gè)輸入元組,發(fā)送0個(gè)或多個(gè)tuples取決于輸入元組并ack到如入元組,Storm提供了一個(gè) IBasicBolt 接口自動(dòng)執(zhí)行ack操作。
在bolts中完全可以啟用新的現(xiàn)成一部處理, OutputCollector線程安全可隨時(shí)調(diào)用。
資源:
- IRichBolt:bolts通用接口
- IBasicBolt:一個(gè)方便定義bolts過濾和些簡(jiǎn)單函數(shù)的接口
- OutputCollector:使用此類型的實(shí)例供bolts發(fā)送元組到輸出流
- 保證消息處理
Stream groupings
定義拓?fù)涞囊徊糠种付總€(gè)bolt該從哪些流中接受如數(shù)。一個(gè)流分組根據(jù)bolt的任務(wù)定義了流應(yīng)該如何劃分。
Storm有8個(gè)內(nèi)置流分組。你也可以通過實(shí)現(xiàn) CustomStreamGrouping接口實(shí)現(xiàn)自定義的流分組。
- Shuffle grouping(洗牌分組):元組隨機(jī)的出現(xiàn)在bolt任務(wù)中,每個(gè)bolt都會(huì)得到等量的tuples
- Fields grouping(字段分組):根據(jù)分組的字段劃分流。例如,如果流是根據(jù)
user-id
的字段分組,有相同user-id
的元組到相同的bolt任務(wù)中,不同的user-id
的元組到不同的任務(wù)中。 - Partial Key grouping:
- All grouping:流被發(fā)送到所有的bolt任務(wù)中,使用此分組需小心。
- Global grouping:整個(gè)流至進(jìn)入到一個(gè)bolt任務(wù)中。明確的,它只會(huì)到id最小的任務(wù)中。
- None grouping
- Direct grouping
- Local or shuffle grouping
資源:
- TopologyBuilder:使用此類定義拓?fù)?/li>
-
InputDeclarer:當(dāng)
TopologyBuilder
調(diào)用setBolt
方法時(shí)返回此對(duì)象,用于聲明bolt輸入流和如何組織流分組。
可靠性
Storm保證每個(gè)spout元組都會(huì)被完全處理。