# Storm基本概念是什么
## 一、Storm概述
Apache Storm是一個開源的分布式實時計算系統,由Nathan Marz團隊于2011年創建,后成為Apache頂級項目。它能夠可靠地處理無界數據流(即持續不斷產生的數據),適用于實時分析、在線機器學習、持續計算等場景。
### 核心特性
- **低延遲**:毫秒級響應能力
- **高容錯**:自動處理節點故障
- **可擴展**:線性擴展能力
- **保證數據不丟失**:精確一次(exactly-once)處理語義
## 二、核心架構組件
### 1. Topology(拓撲)
Storm的核心計算單元,是由Spout和Bolt組成的**有向無環圖(DAG)**。一個拓撲持續運行直到顯式終止。
```java
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("spout", new RandomSentenceSpout(), 5);
builder.setBolt("split", new SplitSentenceBolt(), 8).shuffleGrouping("spout");
builder.setBolt("count", new WordCountBolt(), 12).fieldsGrouping("split", new Fields("word"));
數據流的源頭,通常從消息隊列(如Kafka)或數據庫讀取數據。常見實現:
- KafkaSpout
:從Kafka消費數據
- DRPCSpout
:用于分布式RPC
數據處理單元,可執行: - 過濾(Filtering) - 聚合(Aggregation) - 連接(Joins) - 數據庫交互等操作
public class WordCountBolt extends BaseBasicBolt {
private Map<String, Integer> counts = new HashMap<>();
public void execute(Tuple tuple, BasicOutputCollector collector) {
String word = tuple.getString(0);
counts.merge(word, 1, Integer::sum);
collector.emit(new Values(word, counts.get(word)));
}
}
概念 | 說明 |
---|---|
Tuple | 基本數據單元,包含命名字段列表 |
Stream | 由相同字段結構的Tuple組成的序列 |
Stream ID | 多流場景下的標識符(默認”default”) |
決定Tuple如何路由到Bolt:
分組類型 | 描述 |
---|---|
Shuffle Grouping | 隨機均勻分發(負載均衡) |
Fields Grouping | 按指定字段哈希分發(相同字段值到同一任務) |
All Grouping | 廣播到所有下游任務 |
Global Grouping | 全部發送到同一個任務(通常是ID最小的) |
Direct Grouping | 由發送方指定目標任務 |
// 可靠處理示例
collector.emit(tuple, new Values(word)); // 錨定到輸入tuple
collector.ack(tuple); // 顯式確認
角色 | 職責 |
---|---|
Nimbus | 主節點,負責拓撲提交、任務分配(類似Hadoop的JobTracker) |
Supervisor | 工作節點,管理Worker進程 |
Worker | 實際執行任務的JVM進程(每個Worker運行特定拓撲的部分任務) |
ZooKeeper | 協調集群狀態,實現Nimbus與Supervisor的解耦 |
通過以下參數組合決定實際并發:
- Worker數量:Config.setNumWorkers()
- Executor數量:組件并行度參數
- Task數量:setNumTasks()
(默認等于Executor數)
特性 | Storm | Spark Streaming | Flink |
---|---|---|---|
處理模型 | 原生流處理 | 微批處理 | 原生流處理 |
延遲 | 毫秒級 | 秒級 | 毫秒級 |
狀態管理 | 需自行實現 | 內置 | 完善的內置支持 |
語義保證 | At-least-once | Exactly-once | Exactly-once |
成熟度 | 高 | 高 | 快速發展中 |
實時監控系統
金融風控
物聯網(IoT)
推薦系統
Storm 2.0(2019年發布)重大改進:
Trident:Storm的高級抽象
TridentTopology topology = new TridentTopology();
topology.newStream("spout", spout)
.groupBy(new Fields("word"))
.persistentAggregate(new MemoryMapState.Factory(), new Count(), new Fields("count"));
Storm作為最早的實時計算系統之一,雖然面臨Flink等新框架的競爭,但其簡單直接的編程模型和經過驗證的穩定性,使其在特定場景仍具優勢。理解其核心概念有助于根據業務需求選擇合適的流處理技術。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。