前言:html
Storm讀取實時數據流,並傳遞給處理單元,最終輸出處理後的數據。
下圖描述了storm的處理數據的主要結構。數據庫
元組(Tuple) :
元組是Storm提供的一個輕量級的數據格式,能夠用來包裝你須要實際處理的數據。元組是一次消息傳遞的基本單元。一個元組是一個命名的值列表,其中的每一個值均可以是任意類型的。元組是動態地進行類型轉化的(字段的類型不須要事先聲明)。在Storm中編程時,就是在操做和轉換由元組組成的流。一般,元組包含整數,字節,字符串,浮點數,布爾值和字節數組等類型。要想在元組中使用自定義類型,就須要實現本身的序列化方式。編程
流(Stream) :
一個流由無限的元組序列組成,這些元組會被分佈式並行地建立和處理。經過流中元組包含的字段名稱來定義這個流。
每一個流聲明時都被賦予了一個ID。只有一個流的Spout和Bolt很是常見,因此OutputFieldsDeclarer提供了不須要指定ID來聲明一個流的函數(Spout和Bolt都須要聲明輸出的流)。這種狀況下,流的ID是默認的「default」。數組
Spouts :
Spout(噴嘴)是Storm中流的來源。一般Spout從外部數據源,如消息隊列中讀取元組數據並吐到拓撲裏。Spout能夠是可靠的(reliable)或者不可靠(unreliable)的。可靠的Spout可以在一個元組被Storm處理失敗時從新進行處理,而非可靠的Spout只是吐數據到拓撲裏,不關心處理成功仍是失敗了。架構
Spout能夠一次給多個流吐數據。此時須要經過OutputFieldsDeclarer的declareStream函數來聲明多個流並在調用SpoutOutputCollector提供的emit方法時指定元組吐給哪一個流。負載均衡
Spout中最主要的函數是nextTuple,Storm框架會不斷調用它去作元組的輪詢。若是沒有新的元組過來,就直接返回,不然把新元組吐到拓撲裏。nextTuple必須是非阻塞的,由於Storm在同一個線程裏執行Spout的函數。框架
Spout中另外兩個主要的函數是ack和fail。當Storm檢測到一個從Spout吐出的元組在拓撲中成功處理完時調用ack,沒有成功處理完時調用fail。只有可靠型的Spout會調用ack和fail函數。分佈式
Bolts :
storm是一種分佈式實時計算系統,而storm topology中,全部的實時計算的業務邏輯都是定義在bolt中的。bolt中能夠作任何計算邏輯,好比過濾、執行自定義的函數、聚合、join、訪問數據庫,等等。簡而言之,bolt實際上就是咱們實現或者繼承了storm提供的接口或基類,本身開發的類。函數
接着看一個實例,如何經過Apache Storm來構建Twitter Analysis。結構以下圖所示。大數據
經過Twitter Streaming API爲Twitter Analysis提供輸入數據。Spout經過Twitter Streaming API讀取數據,並以tuple流的形式輸出。隨後tuple將轉發給bolt,bolt將會對tuple進行處理。
Topology(拓撲):
storm topology和mapreduce job是有些相似的。惟一關鍵的區別就在於,mapreduce job是確定會結束運行的;可是storm topology是永遠會運行的,除非你本身手動殺了它。
使用storm開發的實時計算應用程序,全部的計算邏輯都在topology中。一個topology,其實就是邏輯上的計算流向圖,由spout和bolt組成。一個topology能夠包含一個或者多個spout和bolt。而spout和bolt,就是topology這個計算流向圖種的一個一個的計算節點,其中包含了咱們本身編寫的計算代碼。spout和bolt之間的關係和聯繫,其實就定義了實時計算的數據流向。能夠想象成,數據從外部讀入spout,而後傳輸到後面一個一個的bolt;而bolt之間的數據流向,多是交叉層疊的,看起來整個topology就像一個DAG(有向無環圖)同樣。 簡而言之,topology,就是邏輯上的實時計算拓撲圖。
Tasks(任務):
Spout 和 bolt是topology中的最小邏輯單元。topology是經過一個spout和一組bolt構建。邏輯單元須要按特定的順序來執行。Storm所執行的每一個spout和bolt稱爲task。簡而言之,spout或bolt的執行稱爲task。每一個spout和bolt均可以有多個不一樣的實例運行在不一樣的線程中。(每個task對應到一個線程)。
Workers:
toplogy是在分佈式環境下,多個worker節點上運行。storm將任務均勻分配在全部worker節點上。work節點的做用是監放任務(jobs),當有新任務來時,啓動或中止任務的處理。每一個worker是一個物理JVM而且執行整個topology的一部分。
Stream Grouping:
流分組,是拓撲定義中的一部分,爲每一個bolt指定應該接收哪一個流做爲輸入。流分組定義流/元組如何在bolt的任務之間進行分發。
感謝您閱讀上海大數據培訓文章,
更多推薦閱讀:
【上海大數據培訓】storm集羣架構;
【上海大數據培訓】storm如何分配任務和負載均衡