JStorm 是一個分布式實(shí)時計算引擎。JStorm 是一個類似Hadoop MapReduce的系統(tǒng)涂佃, 用戶按照指定的接口實(shí)現(xiàn)一個任務(wù),然后將這個任務(wù)遞交給JStorm系統(tǒng)蜈敢,JStorm將這個任務(wù)跑起來辜荠,并且按7 * 24小時運(yùn)行起來,一旦中間一個Worker 發(fā)生意外故障扶认, 調(diào)度器立即分配一個新的Worker替換這個失效的Worker侨拦。
因此殊橙,從應(yīng)用的角度辐宾,JStorm應(yīng)用是一種遵守某種編程規(guī)范的分布式應(yīng)用狱从。從系統(tǒng)角度, JStorm是一套類似MapReduce的調(diào)度系統(tǒng)叠纹。 從數(shù)據(jù)的角度季研,JStorm是一套基于流水線的消息處理機(jī)制。
Stream
在JStorm中有對于流stream的抽象誉察,流是一個不間斷的無界的連續(xù)tuple与涡,注意JStorm在建模事件流時,把流中的事件抽象為tuple即元組持偏,后面會解釋JStorm中如何使用tuple驼卖。
Spout/Bolt
JStorm認(rèn)為每個stream都有一個stream源,也就是原始元組的源頭鸿秆,所以它將這個源頭抽象為spout酌畜,spout可能是連接消息中間件(如MetaQ, Kafka卿叽, TBNotify等)桥胞,并不斷發(fā)出消息,也可能是從某個隊列中不斷讀取隊列元素并裝配為tuple發(fā)射考婴。
有了源頭即spout也就是有了stream贩虾,那么該如何處理stream內(nèi)的tuple呢,同樣的思想JStorm將tuple的中間處理過程抽象為Bolt沥阱,bolt可以消費(fèi)任意數(shù)量的輸入流缎罢,只要將流方向?qū)蛟揵olt,同時它也可以發(fā)送新的流給其他bolt使用考杉,這樣一來屁使,只要打開特定的spout(管口)再將spout中流出的tuple導(dǎo)向特定的bolt,然后bolt對導(dǎo)入的流做處理后再導(dǎo)向其他bolt或者目的地奔则。
我們可以認(rèn)為spout就是一個一個的水龍頭蛮寂,并且每個水龍頭里流出的水是不同的,我們想拿到哪種水就擰開哪個水龍頭易茬,然后使用管道將水龍頭的水導(dǎo)向到一個水處理器(bolt)酬蹋,水處理器處理后再使用管道導(dǎo)向另一個處理器或者存入容器中。
Tuple
JStorm將流中數(shù)據(jù)抽象為tuple抽莱,一個tuple就是一個值列表value list范抓,list中的每個value都有一個name,并且該value可以是基本類型食铐,字符類型匕垫,字節(jié)數(shù)組等,當(dāng)然也可以是其他可序列化的類型虐呻。拓?fù)涞拿總€節(jié)點(diǎn)都要說明它所發(fā)射出的元組的字段的name象泵,其他節(jié)點(diǎn)只需要訂閱該name就可以接收處理寞秃。
Topology
對應(yīng)上文的介紹,我們可以很容易的理解這幅圖偶惠,這是一張有向無環(huán)圖春寿,JStorm將這個圖抽象為Topology即拓?fù)洌ǖ拇_,拓?fù)浣Y(jié)構(gòu)是有向無環(huán)的)忽孽,拓?fù)涫荍storm中最高層次的一個抽象概念绑改,它可以被提交到Jstorm集群執(zhí)行,一個拓?fù)渚褪且粋€數(shù)據(jù)流轉(zhuǎn)換圖兄一,圖中每個節(jié)點(diǎn)是一個spout或者bolt厘线,圖中的邊表示bolt訂閱了哪些流,當(dāng)spout或者bolt發(fā)送元組到流時出革,它就發(fā)送元組到每個訂閱了該流的bolt(這就意味著不需要我們手工拉管道皆的,只要預(yù)先訂閱,spout就會將流發(fā)到適當(dāng)bolt上)蹋盆。 插個位置說下Jstorm的topology實(shí)現(xiàn)费薄,為了做實(shí)時計算,我們需要設(shè)計一個拓?fù)鋱D栖雾,并實(shí)現(xiàn)其中的Bolt處理細(xì)節(jié)楞抡,JStorm中拓?fù)涠x僅僅是一些Thrift結(jié)構(gòu)體,這樣一來我們就可以使用其他語言來創(chuàng)建和提交拓?fù)洹?/p>
Worker/Task
Worker和Task是JStorm中任務(wù)的執(zhí)行單元析藕, 一個worker表示一個進(jìn)程召廷,一個task表示一個線程, 一個worker可以運(yùn)行多個task账胧。
backtype.storm.Config.setNumWorkers(int workers)是設(shè)置worker數(shù)目竞慢,表示這個Topology運(yùn)行在多個個jvm(一個jvm是一個進(jìn)程,即一個worker)治泥;backtype.storm.topology.TopologyBuilder.setSpout(String id, IRichSpout spout, Number parallelism_hint)和setBolt(String id, IRichBolt bolt,Number parallelism_hint)中的參數(shù) parallelism_hint表示這個spout或bolt有多少個實(shí)例筹煮,即對應(yīng)多少個線程執(zhí)行,一個實(shí)例對應(yīng)一個線程居夹。