# 理解 Storm Topology 的 Parallelism(并行度)
## 什么讓 topology(拓撲)可以運行: worker 進程, executors(執行器)和 tasks(任務)
Storm 區分以下 3 個主要的實體, 它們在 Storm 集群中用于實際的運行 topology(拓撲):
1. Worker 進程
2. Executors(線程)
3. Tasks
這是一個簡單的例子, 以說明他們之間的關系

一個 _worker 進程_ 執行一個 topology(拓撲)的子集. 一個 worker 進程屬于一個指定 topology(拓撲), 并且針對該 topology 的一個或多個組件(spouts 或 bolts)來說會運行一個或更多的 executors(執行器). 一個正在運行的 topology 由許多這樣的進程組成, 它們運行在 Storm 集群的多個機器上.
一個 _executor(執行器)_ 是一個線程, 它是由 worker 進程產生的. 它可能針對相同的組件(spout 或 blot)運行一個或多個 tasks(任務).
一個 _task_ 執行實際的數據處理 - 在您代碼中實現的每個 spout 或 bolt 在整個集群上都執行了許多的 taskk(任務). 組件的 task(任務)數量在 topology(拓撲)的整個生命周期中總是相同的, 但組件的 executors(線程)數量可能會隨時間而變化. 這意味著以下條件成立: `#threads ≤ #tasks`. 默認情況下, 默認情況下,tasks(任務)數量與 executors(執行器)設置成一樣, 例如. Storm 在每個線程上運行一個 task(任務).
## 配置 topology 的 parallelism(并行度)
請注意, 在 Storm 的術語中, "parallelism(并行度)" 特別用于描述所謂的 _parallelism hint_, 它表示組件的 executor(線程)的初始化數量. 在本文檔中, 雖然我們在一般意義上使用術語 "parallelism(并行度)" 來描述如何配置的不僅只有 executor(執行器)的數量, 還可以配置 worker 進程的數量以及 Storm topology 的 tasks(任務)數量. We will specifically call out when "parallelism" is used in the normal, narrow definition of Storm.
以下部分概述了各種配置選項以及如何在代碼中設置它們. 盡管設置這些選項有多種方法, 表中只列出了其中的一些選項. Storm 目前有以下 [配置設置的優先順序](Configuration.html): `defaults.yaml` < `storm.yaml` < topology 級別指定的配置 < 內部 component(組件)指定的配置 < 外部 component(組件)指定的配置.
### worker 進程的數量
* 描述: 在集群的機器中有多少個 worker 進程來 _針對 topology_ 以創建它.
* 配置選項: [TOPOLOGY_WORKERS](javadocs/org/apache/storm/Config.html#TOPOLOGY_WORKERS)
* 如何在代碼中設置(示例):
* [Config#setNumWorkers](javadocs/org/apache/storm/Config.html)
### executors (線程)的數量
* 描述: _每個 component(組件)_ 產生多少個 executors(執行器).
* 配置選項: None (傳遞 `parallelism_hint` 參數到 `setSpout` 或 `setBolt`)
* 如何在代碼中設置(示例):
* [TopologyBuilder#setSpout()](javadocs/org/apache/storm/topology/TopologyBuilder.html)
* [TopologyBuilder#setBolt()](javadocs/org/apache/storm/topology/TopologyBuilder.html)
* 參數現在指定了 bolt 的 executors(執行器)的初始化數量(不是 tasks).
### tasks(任務)的數量
* 描述: _per component_ 有多少個 tasks(任務)來創建他們.
* 配置選項: [TOPOLOGY_TASKS](javadocs/org/apache/storm/Config.html#TOPOLOGY_TASKS)
* 如何在代碼中設置(示例):
* [ComponentConfigurationDeclarer#setNumTasks()](javadocs/org/apache/storm/topology/ComponentConfigurationDeclarer.html)
以下是在練習中顯示這些設置的示例代碼片段:
```
topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2)
.setNumTasks(4)
.shuffleGrouping("blue-spout");
```
在上面的代碼中,我們配置 了Storm 來運行 Bolt "GreenBolt", 其初始數量為兩個 executor(執行器)和四個相關聯的 tasks(任務). Storm 的每個 executor(線程)將會運行兩個 tasks(任務). 如果您不顯示的配置 tasks 的數量, Storm 將使用每個 executor 一個 task 的默認配置來運行它們.
## 運行 topology 的示例
下圖顯示了簡單的 topology(拓撲)是如何運行的. 該 topology 由 3 個 components(組件)構成: 一個名為 `BlueSpout` 的 spout 和兩個名為 `GreenBolt` 和 `YellowBolt` 的 bolts. 該組件鏈接, 使得 `BlueSpout` 將其輸出發送到 `GreenBolt`, 它們將自己的輸出發送到 `YellowBolt`.

該 `GreenBolt` 按照上面的代碼片段進行配置, 而 `BlueSpout` 和 `YellowBolt` 只設置了 parallelism hint(執行器數量). 以下是相關代碼:
```
Config conf = new Config();
conf.setNumWorkers(2); // use two worker processes
topologyBuilder.setSpout("blue-spout", new BlueSpout(), 2); // set parallelism hint to 2
topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2)
.setNumTasks(4)
.shuffleGrouping("blue-spout");
topologyBuilder.setBolt("yellow-bolt", new YellowBolt(), 6)
.shuffleGrouping("green-bolt");
StormSubmitter.submitTopology(
"mytopology",
conf,
topologyBuilder.createTopology()
);
```
當然, Storm 還提供了額外的配置設置來控制 topology(拓撲)的并行度, 包括:
* [TOPOLOGY_MAX_TASK_PARALLELISM](javadocs/org/apache/storm/Config.html#TOPOLOGY_MAX_TASK_PARALLELISM): 此設置針對單個組件生成的 executor(執行器)的數量設置上限. 通常在測試期間使用它來限制在本地模式下運行 topology(拓撲)時產生的線程數. 您可以通過 [Config#setMaxTaskParallelism()](javadocs/org/apache/storm/Config.html#setMaxTaskParallelism(int)) 來設置此選項.
## 如何改變正在運行中的 topology 的并行度
Storm 的一個很好的特性是可以增加或減少 worker 進程 和/或 executor(執行器)的數量, 而無需重新啟動集群或 topology(拓撲). 這樣做的行為稱之為 rebalancing(重新平衡).
您有兩個選項來 rebalance(重新平衡)一個 topology(拓撲):
1. 使用 Storm web UI 來 rebalance(重新平衡)指定的 topology.
2. 使用 CLI 工具 storm rebalance, 如下所示.
以下是一個使用 CLI 工具的示例:
```
## 重新配置 topology "mytopology" 以使用 5 個 worker 進程,
## 該 spout "blue-spout" 要使用 3 個 executors(執行器)并且
## 該 bolt "yellow-bolt" 要使用 10 executors(執行器).
$ storm rebalance mytopology -n 5 -e blue-spout=3 -e yellow-bolt=10
```
## 參考文獻
* [概念](Concepts.html)
* [配置](Configuration.html)
* [在生產集群上運行 topologies(拓撲)](Running-topologies-on-a-production-cluster.html)]
* [Local mode(本地模式)](Local-mode.html)
* [教程](Tutorial.html)
* [Storm API 文檔](javadocs/), most notably the class `Config`
- Storm 基礎
- 概念
- Scheduler(調度器)
- Configuration
- Guaranteeing Message Processing
- 守護進程容錯
- 命令行客戶端
- Storm UI REST API
- 理解 Storm Topology 的 Parallelism(并行度)
- FAQ
- Layers on Top of Storm
- Storm Trident
- Trident 教程
- Trident API 綜述
- Trident State
- Trident Spouts
- Trident RAS API
- Storm SQL
- Storm SQL 集成
- Storm SQL 示例
- Storm SQL 語言參考
- Storm SQL 內部實現
- Flux
- Storm 安裝和部署
- 設置Storm集群
- 本地模式
- 疑難解答
- 在生產集群上運行 Topology
- Maven
- 安全地運行 Apache Storm
- CGroup Enforcement
- Pacemaker
- 資源感知調度器 (Resource Aware Scheduler)
- 用于分析 Storm 的各種內部行為的 Metrics
- Windows 用戶指南
- Storm 中級
- 序列化
- 常見 Topology 模式
- Clojure DSL
- 使用沒有jvm的語言編輯storm
- Distributed RPC
- Transactional Topologies
- Hooks
- Storm Metrics
- Storm 狀態管理
- Windowing Support in Core Storm
- Joining Streams in Storm Core
- Storm Distributed Cache API
- Storm 調試
- 動態日志級別設置
- Storm Logs
- 動態員工分析
- 拓撲事件檢查器
- Storm 與外部系統, 以及其它庫的集成
- Storm Kafka Integration
- Storm Kafka 集成(0.10.x+)
- Storm HBase Integration
- Storm HDFS Integration
- Storm Hive 集成
- Storm Solr 集成
- Storm Cassandra 集成
- Storm JDBC 集成
- Storm JMS 集成
- Storm Redis 集成
- Azue Event Hubs 集成
- Storm Elasticsearch 集成
- Storm MQTT(Message Queuing Telemetry Transport, 消息隊列遙測傳輸) 集成
- Storm MongoDB 集成
- Storm OpenTSDB 集成
- Storm Kinesis 集成
- Storm Druid 集成
- Storm and Kestrel
- Container, Resource Management System Integration
- Storm 高級
- 針對 Storm 定義一個不是 JVM 的 DSL
- 多語言協議
- Storm 內部實現
- 翻譯進度