1. 程式人生 > >2018-11-01期 Storm元件概述

2018-11-01期 Storm元件概述

一、Storm簡介

Storm是一個免費並開源的分散式實時計算系統。利用Storm可以很容易做到可靠地處理無限的資料流,像Hadoop批量處理大資料一樣,Storm可以實時處理資料。

Storm 很簡單,可用於任意程式語言。Apache Storm 採用 Clojure 開發。Storm 有很多應用場景,包括實時資料分析、聯機學習、持續計算、分散式 RPC、ETL 等。

Hadoop(大資料分析領域無可爭辯的王者)專注於批處理。這種模型對許多情形(比如為網頁建立索引)已經足夠,但還存在其他一些使用模型,它們需要來自高度動態的來源的實時資訊。為了解決這個問題,就得藉助 Nathan Marz 推出的 storm(現在已經被Apache孵化)storm 不處理靜態資料,但它處理連續的流資料。

storm特點:

程式設計簡單:開發人員只需要關注應用邏輯,而且跟Hadoop類似,Storm提供的程式設計原語也很簡單

高效能,低延遲:可以應用於廣告搜尋引擎這種要求對廣告主的操作進行實時響應的場景。

分散式:可以輕鬆應對資料量大,單機搞不定的場景

可擴充套件: 隨著業務發展,資料量和計算量越來越大,系統可水平擴充套件

容錯:單個節點掛了不影響應用

訊息不丟失:保證訊息處理

storm與hadoop的比較:

1.Storm用於實時計算,Hadoop用於離線計算。

2. Storm處理的資料儲存在記憶體中,源源不斷;Hadoop處理的資料儲存在檔案系統中,一批一批。

3.  Storm的資料通過網路傳輸進來;Hadoop的資料儲存在磁碟中。

4.  Storm與Hadoop的程式設計模型相似

結構

Hadoop

Storm

主節點

JobTracker

Nimbus

從節點

TaskTracker

Supervisor

應用程式

Job

Topology

工作程序名稱

Child

Worker

計算模型

Map / Reduce

Spout / Bolt

二、Storm元件


Nimbus

Storm叢集的Master節點,負責分發使用者程式碼,指派給具體的Supervisor節點上的Worker節點,去執行Topology對應的元件(Spout/Bolt)的Task。

Supervisor

Storm叢集的從節點,負責管理執行在Supervisor節點上的每一個Worker程序的啟動和終止。通過Storm的配置檔案中的supervisor.slots.ports配置項,可以指定在一個Supervisor上最大允許多少個Slot,每個Slot通過埠號來唯一標識,一個埠號對應一個Worker程序(如該Worker程序被啟動)。

Worker

執行具體處理元件邏輯的程序。Worker執行的任務型別只有兩種,一種是Spout任務,一種是Bolt任務。

Task

worker中每一個spout/bolt的執行緒稱為一個task. 在storm0.8之後,task不再與物理執行緒對應,不同spout/bolt的task可能會共享一個物理執行緒,該執行緒稱為executor。

ZooKeeper

用來協調Nimbus和Supervisor,如果Supervisor因故障出現問題而無法執行Topology,Nimbus會第一時間感知到,並重新分配Topology到其它可用的Supervisor上執行。

三、Storm程式設計模型

Topology:Storm中執行的一個實時應用程式的名稱。將 Spout、 Bolt整合起來的拓撲圖。定義了 Spout和 Bolt的結合關係、併發數量、配置等等。

Spout:在一個topology中獲取源資料流的元件。通常情況下spout會從外部資料來源中讀取資料,然後轉換為topology內部的源資料。

Bolt:接受資料然後執行處理的元件,使用者可以在其中執行自己想要的操作。

Tuple:一次訊息傳遞的基本單元,理解為一組訊息就是一個Tuple。

Stream:Tuple的集合。表示資料的流向。


四、可靠性

(1)、spout的可靠性

spout會記錄它所發射出去的tuple,當下遊任意一個bolt處理失敗時spout能夠重新發射該tuple。在spout的nextTuple()傳送一個tuple時,為實現可靠訊息處理需要給每個spout發出的tuple帶上唯一ID,並將該ID作為引數傳遞給SpoutOutputCollector的emit()方法:collector.emit(new Values("value1","value2"), tupleID);

實際上Values extends ArrayList<Object>

保障過程中,每個bolt每收到一個tuple,都要向上遊應答或報錯,在tuple樹上的所有bolt都確認應答,spout才會隱式呼叫ack()方法表明這條訊息(一條完整的流)已經處理完畢,將會對編號ID的訊息應答確認;處理報錯、超時則會呼叫fail()方法。

(2)、bolt的可靠性

bolt的可靠訊息處理機制包含兩個步驟:

a、當發射衍生的tuple,需要錨定讀入的tuple

b、當處理訊息時,需要應答或報錯

可以通過OutputCollector中emit()的一個過載函式錨定或tuple:collector.emit(tuple, new Values(word)); 並且需要呼叫一次this.collector.ack(tuple)應答。

五、概念描述

   1.拓撲(Topology):打包好的實時應用計算任務,同Hadoop的MapReduce任務相似。

   2.元組(Tuple):是Storm提供的一個輕量級的資料格式,可以用來包裝你需要實際處理的資料。

   3.流(Streams):資料流(Stream)是Storm中對資料進行的抽象,它是時間上×××的tuple元組序列(無限的元組序列)。

   4.Spout(噴嘴):Storm中流的來源。Spout從外部資料來源,如訊息佇列中讀取元組資料並吐到拓撲裡。

   5.Bolts:在拓撲中所有的計算邏輯都是在Bolt中實現的。

   6.任務(Tasks):每個Spout和Bolt會以多個任務(Task)的形式在叢集上執行。

   7.元件(Component):是對Bolt和Spout的統稱。

   8.流分組(Stream groupings):流分組定義了一個流在一個消費它的Bolt內的多個任務(task)之間如何分組。

   9.可靠性(Reliability):Storm保證了拓撲中Spout產生的每個元組都會被處理。

   10.Workers(工作程序):拓撲以一個或多個Worker程序的方式執行。每個Worker程序是一個物理的Java虛擬機器,執行拓撲的一部分任務。

   11.Executor(執行緒):是1個被worker程序啟動的單獨執行緒。每個executor只會執行1個topology的1個component。

   12.Nimbus:Storm叢集的Master節點,負責分發使用者程式碼,指派給具體的Supervisor節點上的Worker節點,去執行Topology對應的元件(Spout/Bolt)的Task。

   13.Supervisor:Storm叢集的從節點,負責管理執行在Supervisor節點上的每一個Worker程序的啟動和終止。