Storm基礎理論
Storm編程模型
元組(Tuple)
元組(Tuple),是消息傳遞的基本單元,是一個命名的值列表,元組中的字段可以是任何類型的對象。Storm使用元組作為其數據模型,元組支持所有的基本類型、字符串和字節數組作為字段值,只要實現類型的序列化接口就可以使用該類型的對象。元組本來應該是一個key-value的Map,但是由于各個組件間傳遞的元組的字段名稱已經事先定義好,所以只要按序把元組填入各個value即可,所以元組是一個value的List。
流(Stream)
流是Storm的核心抽象,是一個無界的元組系列,源源不斷傳遞的元組就組成了流,在分布式環境中并行地進行創建和處理
水龍頭(Spout)
Spout是拓撲的流的來源,是一個拓撲中產生源數據流的組件。通常情況下,Spout會從外部數據源中讀取數據,然后轉換為拓撲內部的源數據。
- Spout可以是可靠的,也可以是不可靠的。如果Storm處理元組失敗,可靠的Spout能夠重新發射,而不可靠的Spout就盡快忘記發出的元組。
- Spout可以發出超過一個流。
- Spout的主要方法是nextTuple()。NextTuple()會發出一個新的Tuple到拓撲,如果沒有新的元組發出,則簡單返回。
- Spout的其他方法是ack()和fail()。當Storm檢測到一個元組從Spout發出時,ack()和fail()會被調用,要么成功完成通過拓撲,要么未能完成。Ack()和fail()僅被可靠的Spout調用。IRichSpout是Spout必須實現的接口。
轉接頭(Bolt)
在拓撲中所有處理都在Bolt中完成,Bolt是流的處理節點,從一個拓撲接收數據,然后執行進行處理的組件。Bolt可以完成過濾、業務處理、連接運算、連接與訪問數據庫等任何操作。
- Bolt是一個被動的角色,七接口中有一個execute()方法,在接收到消息后會調用此方法,用戶可以在其中執行自己希望的操作。
- Bolt可以完成簡單的流的轉換,而完成復雜的流的轉換通常需要多個步驟,因此需要多個Bolt。
- Bolt可以發出超過一個的流。
拓撲(Topology)
拓撲(Topology)是Storm中運行的一個實時應用程序,因為各個組件間的消息流動而形成邏輯上的拓撲結構。
把實時應用程序的運行邏輯打成jar包后提交到Storm的拓撲(Topology)。Storm的拓撲類似于MapReduce的作業(Job)。其主要的區別是,MapReduce的作業最終會完成,而一個拓撲永遠都在運行直到它被殺死。一個拓撲是一個圖的Spout和Bolt的連接流分組。
Storm核心組件
nimbus是整個集群的控管核心,負責topology的提交、運行狀態監控、任務重新分配等工作。
zk就是一個管理者,監控者。
總體描述:nimbus下命令(分配任務),zk監督執行(心跳監控,worker、supurvisor的心跳都歸它管),supervisor領旨(下載代碼),招募人馬(創建worker和線程等),worker、executor就給我干活!task就是具體要干的活。
主控節點與工作節點
Storm集群中有兩類節點:主控節點(Master Node)和工作節點(Worker Node)。其中,主控節點只有一個,而工作節點可以有多個。
Nimbus進程與Supervisor進程
主控節點運行一個稱為Nimbus的守護進程類似于Hadoop的JobTracker。Nimbus負責在集群中分發代碼,對節點分配任務,并監視主機故障。
每個工作節點運行一個稱為Supervisor的守護進程。Supervisor監聽其主機上已經分配的主機的作業,啟動和停止Nimbus已經分配的工作進程。
流分組(Stream grouping)
流分組,是拓撲定義中的一部分,為每個Bolt指定應該接收哪個流作為輸入。流分組定義了流/元組如何在Bolt的任務之間進行分發。Storm內置了8種流分組方式。
工作進程(Worker)
Worker是Spout/Bolt中運行具體處理邏輯的進程。一個worker就是一個進程,進程里面包含一個或多個線程。
執行器(Executor)
一個線程就是一個executor,一個線程會處理一個或多個任務。
任務(Task)
一個任務就是一個task。
實時計算常用架構圖
```mermaid
graph LR
后臺系統(圓角) -->Flume集群(圓角)-->Kafka集群(圓角)-->Storm集群(圓角)-->Redis集群(圓角)
```
- Flume獲取數據。
- Kafka臨時保存數據。
- Strom計算數據。
- Redis是個內存數據庫,用來保存數據。