Storm應用系列之——Spout、Bolt API
1、Component
Storm中,Spout和Bolt都是其Component。所以,Storm定義了一個名叫IComponent的總介面
全家普如下:
綠色部分是我們最常用、比較簡單的部分。紅色部分是與事務相關的,在以後的文章會具體講解。
BaseComponent 是Storm提供的“偷懶”的類。為什麼這麼說呢,它及其子類,都或多或少實現了其介面定義的部分方法。這樣我們在用的時候,可以直接繼承該類,而不是自己每次都寫所有的方法。但值得一提的是,BaseXXX這種定義的類,它所實現的方法,都是空的,直接返回null。
2、Spout
在前面基本例子中,我們實現了一個RandomSpout,來看看其類圖
3、Bolt
ExclaimBasicBolt的類圖:
這裡可以看到一個奇怪的問題:
為什麼IBasicBolt並沒有繼承IBolt?
我們帶著問題往下看。
IBolt定義了三個方法:
如果你確實要反饋失敗,可以丟擲FailedException。
我們來再寫一個Bolt繼承BaseRichBolt替代ExclaimBasicBolt。程式碼如下:
修改topology
執行下,結果一致。
結論:
通常情況下,實現一個Bolt,可以實現IRichBolt介面或繼承BaseRichBolt,如果不想自己處理結果反饋,可以實現IBasicBolt介面或繼承BaseBasicBolt,它實際上相當於自動做掉了prepare方法和collector.emit.ack(inputTuple);
原帖地址:
http://blog.csdn.net/xeseo/article/details/17750379
Storm中,Spout和Bolt都是其Component。所以,Storm定義了一個名叫IComponent的總介面
全家普如下:
綠色部分是我們最常用、比較簡單的部分。紅色部分是與事務相關的,在以後的文章會具體講解。
BaseComponent 是Storm提供的“偷懶”的類。為什麼這麼說呢,它及其子類,都或多或少實現了其介面定義的部分方法。這樣我們在用的時候,可以直接繼承該類,而不是自己每次都寫所有的方法。但值得一提的是,BaseXXX這種定義的類,它所實現的方法,都是空的,直接返回null。
2、Spout
在前面基本例子中,我們實現了一個RandomSpout,來看看其類圖
-
Spout的最頂層抽象是ISpout介面。
open方法是初始化動作。允許你在該spout初始化時做一些動作,傳入了上下文,方便取上下文的一些資料。
close方法在該spout關閉前執行,但是並不能得到保證其一定被執行。spout是作為task執行在worker內,在cluster模式下,supervisor會直接kill -9 woker的程式,這樣它就無法執行了。而在本地模式下,只要不是kill -9, 如果是傳送停止命令,是可以保證close的執行的。
activate和deactivate :一個spout可以被暫時啟用和關閉,這兩個方法分別在對應的時刻被呼叫。
nextTuple 用來發射資料。
ack(Object)
傳入的Object其實是一個id,唯一表示一個tuple。該方法是這個id所對應的tuple被成功處理後執行。
fail(Object)
同ack,只不過是tuple處理失敗時執行。
我們的RandomSpout 由於繼承了BaseRichSpout,所以不用實現close、activate、deactivate、ack、fail和getComponentConfiguration方法,只關心最基本核心的部分。
結論:
通常情況下(Shell和事務型的除外),實現一個Spout,可以直接實現介面IRichSpout,如果不想寫多餘的程式碼,可以直接繼承BaseRichSpout。
3、Bolt
ExclaimBasicBolt的類圖:
這裡可以看到一個奇怪的問題:
為什麼IBasicBolt並沒有繼承IBolt?
我們帶著問題往下看。
IBolt定義了三個方法:
- IBolt繼承了java.io.Serializable,我們在nimbus上提交了topology以後,建立出來的bolt會序列化後傳送到具體執行的worker上去。worker在執行該Bolt時,會先呼叫prepare方法傳入當前執行的上下文
- execute接受一個tuple進行處理,並用prepare方法傳入的OutputCollector的ack方法(表示成功)或fail(表示失敗)來反饋處理結果
-
cleanup 同ISpout的close方法,在關閉前呼叫。同樣不保證其一定執行。
如果你確實要反饋失敗,可以丟擲FailedException。
我們來再寫一個Bolt繼承BaseRichBolt替代ExclaimBasicBolt。程式碼如下:
修改topology
執行下,結果一致。
結論:
通常情況下,實現一個Bolt,可以實現IRichBolt介面或繼承BaseRichBolt,如果不想自己處理結果反饋,可以實現IBasicBolt介面或繼承BaseBasicBolt,它實際上相當於自動做掉了prepare方法和collector.emit.ack(inputTuple);
原帖地址:
http://blog.csdn.net/xeseo/article/details/17750379
相關文章
- Storm 系列(九)—— Storm 整合 KafkaORMKafka
- Storm系列(六)storm和kafka整合ORMKafka
- Dubbo 入門系列之基於 Dubbo API 開發微服務應用API微服務
- Storm 系列(三)—— Storm 單機版本環境搭建ORM
- Storm系列(三)java編寫第個storm程式ORMJava
- SpringCloud系列之Nacos應用篇SpringGCCloud
- Storm框架:如何根據業務條件選擇不同的bolt進行下發訊息ORM框架
- Redis系列之(二)——應用場景Redis
- Storm系列(二)常用shell命令操作ORM
- Apache Storm系列 之二( 輕鬆搞定 Storm 安裝與啟動)ApacheORM
- Laravel box/spout 匯入 ExcelLaravelExcel
- Spring Security系列之入門應用(二)Spring
- SpringCloud系列之Nacos+Dubbo應用篇SpringGCCloud
- 【譯】Apache Storm系列 之一(核心概念)ApacheORM
- Storm系列(一)環境搭建安裝ORM
- SpringCloud系列之Nacos+Dubbo+Seata應用篇SpringGCCloud
- SpringCloud系列之閘道器(Gateway)應用篇SpringGCCloudGateway
- Storm系列(五)DRPC實現遠端呼叫ORMRPC
- OPENAI API應用文件OpenAIAPI
- 構建 API 應用API
- Netty系列文章之構建HTTP(HTTPS)應用程式NettyHTTP
- CI/CD系列之阿里云云效2020應用篇阿里
- Spark 系列(九)—— Spark SQL 之 Structured APISparkSQLStructAPI
- Storm系列(四)並行度和流分組ORM並行
- 大資料Storm 之RCE實踐大資料ORM
- ViewPager系列之 仿魅族應用的廣告BannerViewViewpager
- SpringCloud系列之整合分散式事務Seata應用篇SpringGCCloud分散式
- StormORM
- Dubbo 入門系列之快速部署一個微服務應用微服務
- 如何使用電商API介面API介面如何應用API
- SpringCloud系列之API閘道器(Gateway)服務ZuulSpringGCCloudAPIGatewayZuul
- API介面:原理、設計與應用API
- 商品API的應用場景分析API
- [應用案例]OT應用案例之dasdig
- C語言系列之 指標強化與應用視訊教程C語言指標
- 詳解Web應用安全系列(2)注入漏洞之XSS攻擊Web
- api應該怎麼用?(簡單方便的API介面方法)API
- 「Mybatis系列」Mybatis高階應用MyBatis
- 在 Laravel 應用中構建 GraphQL APILaravelAPI