流式計算中,各個中間件產(chǎn)品對計算過程中的角色的抽象都不盡相同,實現(xiàn)方式也是千差萬別。本文針對storm中間件在進(jìn)行流式計算中的幾個概念做個概括總結(jié)。
基本元素:
storm分布式計算結(jié)構(gòu)稱為topology(拓?fù)?由stream,spout,bolt組成。
spout代表一個storm拓?fù)渲械臄?shù)據(jù)入口,連接到數(shù)據(jù)源,將數(shù)據(jù)轉(zhuǎn)化為一個個tuple,并發(fā)射tuple
stream是由無限制個tuple組成的序列。tuple為storm的核心數(shù)據(jù)結(jié)構(gòu),是包含了一個或多個鍵值對的列表。
bolt可以理解為計算程序中的運(yùn)算或者函數(shù),bolt的上游是輸入流,經(jīng)過bolt實施運(yùn)算后,可輸出一個或者多個輸出流。
bolt可以訂閱多個由spout或者其他bolt發(fā)射的數(shù)據(jù)流,用以構(gòu)建復(fù)雜的數(shù)據(jù)流轉(zhuǎn)換網(wǎng)絡(luò)。
上述即為storm最基本的組成元素,無論storm如何運(yùn)行,都是以stream,spout,bolt做為最基本的運(yùn)行單元。而這三者則是共同構(gòu)成了一個storm拓?fù)鋞opology。
storm集群組成部分:
首先需要明確一個概念,bolt,spout實例,都屬于任務(wù),spout產(chǎn)生數(shù)據(jù)流,并發(fā)射,bolt消費(fèi)數(shù)據(jù)流,進(jìn)行計算,并進(jìn)行落地或再發(fā)射,他們的存在以及運(yùn)行過程都需要消耗資源,而storm集群是一個提供了資源的集群,我們要做的就是將spout/boult實例合理分配到storm集群提供的計算資源上,這樣就可以讓spout/bolt得以執(zhí)行。
worker為JVM進(jìn)程,一個topology會分配到一個或者多個worker上運(yùn)行。
executor是worker內(nèi)的java線程,是具體執(zhí)行bolt/spout實例用的。下篇文章在介紹如何提供storm并行計算能力時會介紹worker以及executor的配置。
在storm中,worker是由supervisor進(jìn)程創(chuàng)建,并進(jìn)行監(jiān)控的。storm集群遵循主從模式,主為nimbus,從為supervisor,storm集群由一個主節(jié)點(確實有單點問題),和多個工作節(jié)點(supervisor)組成,并使用zookeeper來協(xié)調(diào)集群中的狀態(tài)信息,比如任務(wù)分配情況,worker狀態(tài),supervisor的拓?fù)涠攘俊?/p>
通過配置可指定supervisor上可運(yùn)行多少worker。一個worker代表一個slot。
nimbus守護(hù)進(jìn)程的主要職責(zé)是管理,協(xié)調(diào)和監(jiān)控在集群上運(yùn)行的topology.包括topology的發(fā)布,任務(wù)指派,事件處理失敗時重新指派任務(wù)。
supervisor守護(hù)進(jìn)程等待nimbus分配任務(wù)后生成并監(jiān)控workers執(zhí)行任務(wù)。supervosior和worker都是運(yùn)行在不同的JVM進(jìn)程上。
了解了集群模式下,storm大致的分布概念,下面結(jié)合筆者做的一個實例,了解一下如何發(fā)布計算資源到storm集群上。
注:本文不花費(fèi)大量篇章在代碼實現(xiàn)說明上,讀者主要著重概念。
筆者定義了一個spout,兩個bolt 運(yùn)算過程如下:
其中streamMaking是一個不斷生成隨機(jī)數(shù)(5~30)的spout實例,Step1Bolt會過濾掉15以下的隨機(jī)數(shù)(過濾),15以上的隨機(jī)數(shù)會乘以16(計算),再將結(jié)果向后發(fā)射。Step2Bolt訂閱Step1Bolt發(fā)射的數(shù)據(jù),接收數(shù)據(jù)后,打印輸出。流程結(jié)束。
筆者在定義spout/bolt實例時,配置了spout,bolt的并行執(zhí)行數(shù)。其中
streamMaking:4 ? Step1Bolt:2 ?Step2Bolt 1
這樣,發(fā)布成功后,storm會根據(jù)我的配置,分配足夠的計算資源給予spout/bolt進(jìn)行執(zhí)行。
發(fā)布:
發(fā)布時,spout和bolt都是在一起以jar的形式發(fā)布到nimbus上的,分配后,內(nèi)部定義的spout和bolt將以組件的形式被nimbus分配至worker進(jìn)程中執(zhí)行。
其中worker都是由supervisor創(chuàng)建的,創(chuàng)建出來的worker進(jìn)程與supervisor是分開的不同進(jìn)程。一個supervisor可創(chuàng)建多少worker可通過修改storm安裝目錄下的storm.yaml進(jìn)行配置。
task是執(zhí)行的最小單元。spout/bolt實例在定義中指定了,要起多少task,以及多少executor。也即一個topology發(fā)布之前已經(jīng)定義了task總量,和需要多少資源來執(zhí)行我的task總量。nimbus將根據(jù)已有的計算資源進(jìn)行分配。
下圖中:? nimbus左邊代表著計算任務(wù)量,和所需計算配置
nimbus右邊代表著計算資源
nimbus將根據(jù)計算資源信息,合理的分發(fā)計算任務(wù)量。
發(fā)布成功后,通過storm自帶的UI功能,可以查看你發(fā)布的topology運(yùn)行以及其中每個組件的分布執(zhí)行情況。
監(jiān)控圖像中清晰的顯示了,目前部署的topology,以及topology中每個組件所分配的計算資源所在host,以及每個組件發(fā)射了多少tuple,接收了多少tuple,以及有多少個executor在并行執(zhí)行。
本文講述了storm內(nèi)的基本元素以及基本概念,后續(xù)將講述storm的重點配置信息,以及如何提高并發(fā)計算能力,窗口概念等高級特性,后續(xù)會進(jìn)行源碼分析,以及與其他實時計算中間件的比較。