Storm集群中的任務稱之為Topology佩迟。
對比Hadoop中的MapReduce job蚁鳖,mapper用于從數據源中獲取數據脏嚷,經過簡單處理,以一定的格式傳遞給reducer擎场,reducer負責后續(xù)處理羽德。
類似的,Topology任務也要從數據源中獲取數據迅办,然后進行后續(xù)處理宅静。在Topology中從外部數據源獲取數據的組件,稱之為Spout站欺,處理數據的組件姨夹,稱之為bolt。一個Topology就是由一個或者多個的Spout和Bolt組成矾策。
對于如下:
數據獲取數據處理
HadoopMapperReducer
StormSpoutBolt
小貼士:Storm中有一些術語(不是全部)磷账,是按照氣象術語來命名的。例如Storm是暴風雨贾虽,spout是龍卷風的意思逃糟,bolt是雷電的意思,nimbus是雨云的意思。
接下來绰咽,我們從簡單到復雜逐步分析一個Topology的組成蛉抓。
1、最簡單的Topology:1個Spout剃诅,1個Bolt
Topology:在這個Topology中巷送,我們看到一個Spout和一個Bolt。在Topology中矛辕,我們將Spout和Bolt稱之為組件(Components)笑跛。一個Topology中,必須同時存在Spout和Bolt聊品,Spout和Bolt數量可以隨意飞蹂。最簡單的就是如上圖,一個Topology中只有一個Spout和一個Bolt翻屈。要提醒的是:Topology的組件目前只有Spout和Bolt陈哑,沒有其他組件。所以以后提到一個Topology的組件的時候伸眶,其實也就是指的是Spout或者Bolt惊窖。
Stream:我們已經知道Spout是從外部數據源中獲取數據,以一定的格式將數據傳遞給Bolt處理厘贼。從Spout中源源不斷的給Bolt傳遞數據界酒,形成的這個數據通道我們稱之為Stream(流)。因為Strom是一個實時計算的流式處理框架嘴秸,其不是像hadoop那樣毁欣,一次性處理一大批的數據(批處理),Storm是不斷從外部數據源中獲取最新的數據岳掐,然后將新的數據傳遞給Bolt處理(增量處理)凭疮。這樣不斷的獲取與傳輸就形成了這個數據流通道就稱之為Stream,如上圖的虛線所示串述。
Tuple:Tuple這個概念在上面沒有明顯的標記出來执解,其實Stream的最小組成單元。上圖中的Steam是一條虛線剖煌,我們可以將虛線中的每一個小線段"-"看成一個Tuple材鹦。因為Storm的Spout需要源源不斷的向Bolt發(fā)送數據逝淹,每一次發(fā)送的數據我們稱之為一個Tuple耕姊,也就是說,Stream流實際上就是通過這些源源不斷的Tuple組成。在Storm官網上有這樣一句話" A stream is an unbounded sequence of tuples ..."栅葡,unbounded的意思其實就是說茉兰,Spout是源源不斷的發(fā)送Tuple給Bolt的,我們不知道什么時候會停止發(fā)送Tuple欣簇,因此當然是無邊界的规脸。
2坯约、稍微復雜的Topology:1個Spout、多個Bolt
Topology:在這個Topology中莫鸭,我們有一個spout和3個bolt闹丐。從數據流向中,我們可以看出被因,spout可以將數據傳遞給多個bolt卿拴,bolt還能將數據傳遞給下一級bolt。我們知道Bolt在Topology中的作用是處理器梨与,也就是說Bolt是負責處理數據的堕花。對于同一條數據,我們可能會挖掘出不同方面的信息粥鞋。以中間的并列的2個Bolt為例缘挽,Spout可以將數據同時發(fā)送給2個Bolt,這兩個Bolt分別從不同的方便來分析這條數據呻粹。我們還可以看到壕曼,位于中上方的Bolt還將數據傳遞給了下一級Bolt,這樣的原因是等浊,有的時候窝稿,我們對于數據的分析必須是一步一步的,后一步的分析必須建立在之前分析的基礎上凿掂。
Stream:在上圖中伴榔,我們標記出了3個Stream。在Topology中庄萎,Spout與Bolt,Bolt與Bolt之間的數據通道都是一個流踪少。圖上分別用Stream1,Stream2糠涛、Stream3標記出援奢。這三個流有什么區(qū)別和聯系嗎?必須的忍捡。我們已經知道,Stream都是由Tuple組成的集漾,而Tuple是有數據格式的,在同一個流中,Tuple的數據格式應該都是一樣的砸脊;不同流中的數據格式可能相同具篇,也可能不同。舉例來說凌埂,假設我們這里的Spout每次都是將相同的數據發(fā)送給中間的2個Bolt進行處理驱显,那么Stream1和Stream2中Tuple的數據格式都是一樣的。前一個Bolt處理完還要將數據傳遞給下一級Bolt,處理完后的數據可能是另外一種格式埃疫。這時Stream3數據流中的數據格式可能與Stream1和Stream2就是不同的了伏恐。
3、復雜的Topology:多個Spout與多個Bolt
Topology:這可以算得上一個比較復雜的Topology了栓霜,在圖中有2個Spout翠桦、4個Bolt。再次深入胳蛮,我們發(fā)現一個Spout可以同時發(fā)送數據到多個Bolt秤掌,形成多個數據流,例如Spout1鹰霍。一個Bolt可以接受多個輸入闻鉴,如bolt3、bolt4茂洒。事實上孟岛,一個Bolt也可以產生多個到下一級Bolt的數據流,在圖中并沒有體現出來督勺。
我們在這里主要介紹一下渠羞,什么情況下一個Topology中會需要多個Spout。以一個實際案例智哀,假設有一個移動醫(yī)療app次询。用戶可以在APP上進行問診,會有醫(yī)生來進行回答瓷叫。這種情況下屯吊,醫(yī)生頭像在APP上顯示的位置必須是實時變化的,因為如果咨詢同一個醫(yī)生的用戶太多摹菠,后面的用戶就會排隊很長時間盒卸。因此,我們會使用Storm來實時計算醫(yī)生的權重次氨,權重越高蔽介,說明這個醫(yī)生當前比較空閑,而權重越低煮寡,說明醫(yī)生越忙虹蓄。APP會實時獲取醫(yī)生權重,將權重高的醫(yī)生幸撕,排在越前面∞弊椋現在的問題就是如何計算醫(yī)生的權重,簡單說2個維度:問診量杈帐、排隊數体箕。問診量表示的是當前醫(yī)生同時回答的病人的數量专钉,排隊數是有幾個人在排隊挑童±矍Γ基本上問診量越低,排隊數越少站叼,說明這個醫(yī)生越閑娃兽,權重應該就越高。在我們的Topology中尽楔,就可以用兩個Spout投储,一個用于從外部數據源中獲取醫(yī)生的問診量,一個用于獲取排隊數阔馋。當然實際的情況比這個肯定復雜玛荞,這里只是說明多個Spout在什么情況下會使用到。
DAG(有向無環(huán)圖)說明:
在storm中呕寝,spout和bolt勋眯、bolt與bolt之間的數據流向,將整合topology串起來了下梢。在網上千篇一律的翻譯或者轉載的文章中客蹋,我們可能也看到了很多次DAG這個概念。其實DAG很簡單孽江,有向無環(huán)圖讶坯,意思就是數據流是有方向的,但是不能形成一個環(huán)狀岗屏。如果形成了一個環(huán)狀辆琅,那么意味著Bolt中的數據還可能傳給Spout,spout又要傳遞給Bolt这刷。這就形成了一個死循環(huán)涎跨,Stream中的一個數據(Tuple)永遠也沒辦法處理完。
以下這個圖有2個環(huán)崭歧,不論是右上Bolt之間形成的環(huán)隅很,還是右下Spout與Bout之間形成的環(huán),都是不允許率碾。