Storm核心组件运行机制
1. storm集群启动后,nimbus进程、supervisor进程,分别向zookeeper进行注册
- nimbus做为服务方,往zookeeper对应目录写job配置信息文件
- supervisor做为客户端,监控zookeeper对应的目录
2. 通过strom client客户端提交job到nimbus,其中包括:
- 指定spout、bolt实现类,以及并行数量
- 各个spout、bolt的依赖关系和分组关系
- Storm配置信息、运行方式(如:服务器提交或本地提交)
3. nimbus收到客户提交的Job请求信息后,按storm集群的配置信息,以及当前集群上空闲的worker信息,进行任务分配,将任务分配给supervisor,并将上述信息进行序列化,存储到zookeeper集群上,其中序列化的信息包括:

- 由哪几台supervisor(机器),启动多少个worker,多少并行线程数
- superviso和worker对应的ip地址和端口号
- job程序
4. zookeeper监控到nimbus的写文件操作后,发送事件通知所有supervisor,对应的supervisor收到事件通知后,去zookeeper指定目录获取worker和job信息,并启动相应数量的worker和Exectuor(一般情况下,一个Executor对应一个Task任务,一个Task可以是一个spout对象实例或一个bolt对象实例)
5. Executor启动后,通过spout去读取数据源(数据源可能是:消息中间件、数据库、文件等数据)
6. 在上一步的基础上,spout读取外部数据源信息,通过调用nextTuple方法,进行任务处理,然后将处理结果发送给Topology程序,Topologyt程序由Storm框架将结果发往Storm的消息队列,然后Storm框架去消费队列中的一个消息,然后去调用下一个依赖的bolt,通过反序列化将Topology对象信息传bolt对象,然后去调用bolt的execute方法进行处理
7. Exeutor按照spout和bolt的依赖关系,持续处理数据,直接到整个Topology执行结束(在Storm中通过UI界面或Storm命令结束Topology)