流式計(jì)算中咆霜,各個(gè)中間件產(chǎn)品對(duì)計(jì)算過程中的角色的抽象都不盡相同,實(shí)現(xiàn)方式也是千差萬(wàn)別。本文針對(duì)storm中間件在進(jìn)行流式計(jì)算中的幾個(gè)概念做個(gè)概括總結(jié)席噩。
基本元素:
storm分布式計(jì)算結(jié)構(gòu)稱為topology(拓?fù)?由stream,spout,bolt組成。
spout代表一個(gè)storm拓?fù)渲械臄?shù)據(jù)入口贤壁,連接到數(shù)據(jù)源悼枢,將數(shù)據(jù)轉(zhuǎn)化為一個(gè)個(gè)tuple,并發(fā)射tuple
stream是由無(wú)限制個(gè)tuple組成的序列脾拆。tuple為storm的核心數(shù)據(jù)結(jié)構(gòu)馒索,是包含了一個(gè)或多個(gè)鍵值對(duì)的列表莹妒。
bolt可以理解為計(jì)算程序中的運(yùn)算或者函數(shù),bolt的上游是輸入流绰上,經(jīng)過bolt實(shí)施運(yùn)算后旨怠,可輸出一個(gè)或者多個(gè)輸出流。
bolt可以訂閱多個(gè)由spout或者其他bolt發(fā)射的數(shù)據(jù)流蜈块,用以構(gòu)建復(fù)雜的數(shù)據(jù)流轉(zhuǎn)換網(wǎng)絡(luò)鉴腻。
上述即為storm最基本的組成元素,無(wú)論storm如何運(yùn)行百揭,都是以stream,spout,bolt做為最基本的運(yùn)行單元爽哎。而這三者則是共同構(gòu)成了一個(gè)storm拓?fù)鋞opology。
storm集群組成部分:
首先需要明確一個(gè)概念器一,bolt,spout實(shí)例课锌,都屬于任務(wù),spout產(chǎn)生數(shù)據(jù)流盹舞,并發(fā)射产镐,bolt消費(fèi)數(shù)據(jù)流,進(jìn)行計(jì)算踢步,并進(jìn)行落地或再發(fā)射癣亚,他們的存在以及運(yùn)行過程都需要消耗資源,而storm集群是一個(gè)提供了資源的集群,我們要做的就是將spout/boult實(shí)例合理分配到storm集群提供的計(jì)算資源上,這樣就可以讓spout/bolt得以執(zhí)行驳庭。
worker為JVM進(jìn)程,一個(gè)topology會(huì)分配到一個(gè)或者多個(gè)worker上運(yùn)行玻孟。
executor是worker內(nèi)的java線程,是具體執(zhí)行bolt/spout實(shí)例用的鳍征。下篇文章在介紹如何提供storm并行計(jì)算能力時(shí)會(huì)介紹worker以及executor的配置黍翎。
在storm中,worker是由supervisor進(jìn)程創(chuàng)建艳丛,并進(jìn)行監(jiān)控的匣掸。storm集群遵循主從模式,主為nimbus氮双,從為supervisor碰酝,storm集群由一個(gè)主節(jié)點(diǎn)(確實(shí)有單點(diǎn)問題),和多個(gè)工作節(jié)點(diǎn)(supervisor)組成戴差,并使用zookeeper來(lái)協(xié)調(diào)集群中的狀態(tài)信息送爸,比如任務(wù)分配情況,worker狀態(tài),supervisor的拓?fù)涠攘俊?/p>
通過配置可指定supervisor上可運(yùn)行多少worker袭厂。一個(gè)worker代表一個(gè)slot墨吓。
nimbus守護(hù)進(jìn)程的主要職責(zé)是管理,協(xié)調(diào)和監(jiān)控在集群上運(yùn)行的topology.包括topology的發(fā)布纹磺,任務(wù)指派肛真,事件處理失敗時(shí)重新指派任務(wù)。
supervisor守護(hù)進(jìn)程等待nimbus分配任務(wù)后生成并監(jiān)控workers執(zhí)行任務(wù)爽航。supervosior和worker都是運(yùn)行在不同的JVM進(jìn)程上。
了解了集群模式下乾忱,storm大致的分布概念讥珍,下面結(jié)合筆者做的一個(gè)實(shí)例,了解一下如何發(fā)布計(jì)算資源到storm集群上窄瘟。
注:本文不花費(fèi)大量篇章在代碼實(shí)現(xiàn)說明上衷佃,讀者主要著重概念。
筆者定義了一個(gè)spout,兩個(gè)bolt 運(yùn)算過程如下:
其中streamMaking是一個(gè)不斷生成隨機(jī)數(shù)(5~30)的spout實(shí)例蹄葱,Step1Bolt會(huì)過濾掉15以下的隨機(jī)數(shù)(過濾)氏义,15以上的隨機(jī)數(shù)會(huì)乘以16(計(jì)算),再將結(jié)果向后發(fā)射图云。Step2Bolt訂閱Step1Bolt發(fā)射的數(shù)據(jù)惯悠,接收數(shù)據(jù)后,打印輸出竣况。流程結(jié)束克婶。
筆者在定義spout/bolt實(shí)例時(shí),配置了spout,bolt的并行執(zhí)行數(shù)丹泉。其中
streamMaking:4 ? Step1Bolt:2 ?Step2Bolt 1
這樣情萤,發(fā)布成功后,storm會(huì)根據(jù)我的配置摹恨,分配足夠的計(jì)算資源給予spout/bolt進(jìn)行執(zhí)行筋岛。
發(fā)布:
發(fā)布時(shí),spout和bolt都是在一起以jar的形式發(fā)布到nimbus上的晒哄,分配后睁宰,內(nèi)部定義的spout和bolt將以組件的形式被nimbus分配至worker進(jìn)程中執(zhí)行。
其中worker都是由supervisor創(chuàng)建的揩晴,創(chuàng)建出來(lái)的worker進(jìn)程與supervisor是分開的不同進(jìn)程勋陪。一個(gè)supervisor可創(chuàng)建多少worker可通過修改storm安裝目錄下的storm.yaml進(jìn)行配置。
task是執(zhí)行的最小單元。spout/bolt實(shí)例在定義中指定了违孝,要起多少task刹前,以及多少executor。也即一個(gè)topology發(fā)布之前已經(jīng)定義了task總量雌桑,和需要多少資源來(lái)執(zhí)行我的task總量喇喉。nimbus將根據(jù)已有的計(jì)算資源進(jìn)行分配。
下圖中:? nimbus左邊代表著計(jì)算任務(wù)量校坑,和所需計(jì)算配置
nimbus右邊代表著計(jì)算資源
nimbus將根據(jù)計(jì)算資源信息拣技,合理的分發(fā)計(jì)算任務(wù)量。
發(fā)布成功后耍目,通過storm自帶的UI功能膏斤,可以查看你發(fā)布的topology運(yùn)行以及其中每個(gè)組件的分布執(zhí)行情況。
監(jiān)控圖像中清晰的顯示了邪驮,目前部署的topology莫辨,以及topology中每個(gè)組件所分配的計(jì)算資源所在host,以及每個(gè)組件發(fā)射了多少tuple毅访,接收了多少tuple沮榜,以及有多少個(gè)executor在并行執(zhí)行。
本文講述了storm內(nèi)的基本元素以及基本概念喻粹,后續(xù)將講述storm的重點(diǎn)配置信息蟆融,以及如何提高并發(fā)計(jì)算能力,窗口概念等高級(jí)特性守呜,后續(xù)會(huì)進(jìn)行源碼分析振愿,以及與其他實(shí)時(shí)計(jì)算中間件的比較。