## 十一 Storm核心概念

**Topology**：Storm中运行的一个实时应用程序，因为各个组件间的消息流动形成逻辑上的一个拓扑结构。

**Spout**：消息的源头, 在一个topology中产生源数据流的组件。通常情况下spout会从外部数据源中读取数据，然后转换为topology内部的源数据。Spout是一个主动的角色，其接口中有个nextTuple()函数，storm框架会不停地调用此函数，用户只要在其中生成源数据即可。

**Bolt**：消息处理单元, 在一个topology中接受数据然后执行处理的组件。Bolt可以执行过滤、函数操作、合并、写数据库等任何操作。Bolt是一个被动的角色，其接口中有个execute(Tuple input)函数,在接受到消息后会调用此函数，用户可以在其中执行自己想要的操作。

**Tuple**：一次消息传递的基本单元。本来应该是一个key-value的map，但是由于各个组件间传递的tuple的字段名称已经事先定义好，所以tuple中只要按序填入各个value就行了，所以就是一个value list.

**Stream**：源源不断传递的tuple就组成了stream。

![](img/sm02.png)

### storm架构

![](img/sm03.png)

- 类似于Hadoop的架构, 主从(Master/Slave)

  - Nimbus: 主

  ​	集群的主节点, 负责任务(task)的指派和分发、资源的分配

  - Supervisor: 从

    - 集群的从节点, 负责执行任务的具体部分, 

    - 可以启动多个Worker, 一个Topo可以运行在一个/多个Worker之上

    - 管理worker进程的启动和停止

  - Nimbus Supervisor无状态, 元数据会存储在zk中
  - worker: 运行具体组件逻辑(Spout/Bolt) 的进程
  - task : Spout和Bolt  Worker中每一个Spout和Bolt的线程称为一个Task