一、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的編程模型相似
二、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進程的啓動和終止。