小編給大家分享一下storm中spout和bolt java api有什么用,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
成都創(chuàng)新互聯(lián)公司專注于中大型企業(yè)的成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)和網(wǎng)站改版、網(wǎng)站營銷服務(wù),追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術(shù)與技術(shù)開發(fā)的融合,累計(jì)客戶千余家,服務(wù)滿意度達(dá)97%。幫助廣大客戶順利對(duì)接上互聯(lián)網(wǎng)浪潮,準(zhǔn)確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運(yùn)用,我們將一直專注成都品牌網(wǎng)站建設(shè)和互聯(lián)網(wǎng)程序開發(fā),在前進(jìn)的路上,與客戶一起成長!
Component
Storm中,Spout和Bolt都是其Component。所以,Storm定義了一個(gè)名叫IComponent的總接口
圖譜如下:
綠色部分是我們最常用、比較簡(jiǎn)單的部分。紅色部分是與事務(wù)相關(guān)的,在以后的文章會(huì)具體講解。
BaseComponent 是Storm提供的“偷懶”的類。為什么這么說呢,它及其子類,都或多或少實(shí)現(xiàn)了其接口定義的部分方法。這樣我們?cè)谟玫臅r(shí)候,可以直接繼承該類,而不是自己每次都寫所有的方法。但值得一提的是,BaseXXX這種定義的類,它所實(shí)現(xiàn)的方法,都是空的,直接返回null。
Spout
在前面基本例子中,我們實(shí)現(xiàn)了一個(gè)RandomSpout,來看看其類圖
Spout的最頂層抽象是ISpout接口。
open方法是初始化動(dòng)作。允許你在該spout初始化時(shí)做一些動(dòng)作,傳入了上下文,方便取上下文的一些數(shù)據(jù)。
close方法在該spout關(guān)閉前執(zhí)行,但是并不能得到保證其一定被執(zhí)行。spout是作為task運(yùn)行在worker內(nèi),在cluster模式下,supervisor會(huì)直接kill -9 woker的進(jìn)程,這樣它就無法執(zhí)行了。而在本地模式下,只要不是kill -9, 如果是發(fā)送停止命令,是可以保證close的執(zhí)行的。
activate和deactivate :一個(gè)spout可以被暫時(shí)激活和關(guān)閉,這兩個(gè)方法分別在對(duì)應(yīng)的時(shí)刻被調(diào)用。
nextTuple 用來發(fā)射數(shù)據(jù)。
ack(Object)
傳入的Object其實(shí)是一個(gè)id,唯一表示一個(gè)tuple。該方法是這個(gè)id所對(duì)應(yīng)的tuple被成功處理后執(zhí)行。
fail(Object)
同ack,只不過是tuple處理失敗時(shí)執(zhí)行。
我們的RandomSpout 由于繼承了BaseRichSpout,所以不用實(shí)現(xiàn)close、activate、deactivate、ack、fail和getComponentConfiguration方法,只關(guān)心最基本核心的部分。
結(jié)論:
通常情況下(Shell和事務(wù)型的除外),實(shí)現(xiàn)一個(gè)Spout,可以直接實(shí)現(xiàn)接口IRichSpout,如果不想寫多余的代碼,可以直接繼承BaseRichSpout。
Bolt
ExclaimBasicBolt的類圖:
這里可以看到一個(gè)奇怪的問題:
為什么IBasicBolt并沒有繼承IBolt?
我們帶著問題往下看。
IBolt定義了三個(gè)方法:
IBolt繼承了java.io.Serializable,我們?cè)趎imbus上提交了topology以后,創(chuàng)建出來的bolt會(huì)序列化后發(fā)送到具體執(zhí)行的worker上去。worker在執(zhí)行該Bolt時(shí),會(huì)先調(diào)用prepare方法傳入當(dāng)前執(zhí)行的上下文
execute接受一個(gè)tuple進(jìn)行處理,并用prepare方法傳入的OutputCollector的ack方法(表示成功)或fail(表示失?。﹣矸答佁幚斫Y(jié)果
cleanup 同ISpout的close方法,在關(guān)閉前調(diào)用。同樣不保證其一定執(zhí)行。
紅色部分是Bolt實(shí)現(xiàn)時(shí)一定要注意的地方。而Storm提供了IBasicBolt接口,其目的就是實(shí)現(xiàn)該接口的Bolt不用在代碼中提供反饋結(jié)果了,Storm內(nèi)部會(huì)自動(dòng)反饋成功。
如果你確實(shí)要反饋失敗,可以拋出FailedException。
我們來再寫一個(gè)Bolt繼承BaseRichBolt替代ExclaimBasicBolt。代碼如下:
public
class
ExclaimRichBolt
extends
BaseRichBolt {
private
OutputCollector collector;
@Override
public
void
prepare(Map stormConf, TopologyContext context,
OutputCollector collector) {
this
.collector = collector;
}
@Override
public
void
execute(Tuple tuple) {
this
.collector.emit(tuple,
new
Values(tuple.getString(
0
)+
"!"
));
this
.collector.ack(tuple);
}
@Override
public
void
declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(
new
Fields(
"after_excl"
));
}
}
修改topology
//builder.setBolt("exclaim", new ExclaimBasicBolt(), 2).shuffleGrouping("spout");
builder.setBolt(
"exclaim"
,
new
ExclaimRichBolt(),
2
).shuffleGrouping(
"spout"
);
運(yùn)行下,結(jié)果一致。
結(jié)論:
通常情況下,實(shí)現(xiàn)一個(gè)Bolt,可以實(shí)現(xiàn)IRichBolt接口或繼承BaseRichBolt,如果不想自己處理結(jié)果反饋,可以實(shí)現(xiàn)IBasicBolt接口或繼承BaseBasicBolt,它實(shí)際上相當(dāng)于自動(dòng)做掉了prepare方法和collector.emit.ack(inputTuple);
看完了這篇文章,相信你對(duì)“storm中spout和bolt java api有什么用”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
文章名稱:storm中spout和boltjavaapi有什么用
分享URL:http://www.rwnh.cn/article30/gjhpso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、動(dòng)態(tài)網(wǎng)站、定制網(wǎng)站、標(biāo)簽優(yōu)化、、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)