–集群管理
–调度topology
Supervisor
–启停worker
Worker
–一个JVM进程资源分配的单位
–启动executor
Executor
–实际干活的线程
Zookeeper
- 存储状态信息,调度信息,心跳信息等
Nimbus:相当于master,storm是master/slave的架构
–它负责两个事情,第一个负责管理集群,这些slave都向zookeeper写信息,然后nimbus通过zk获取这些slave节点的信息,这样nimbus就知道集群里面有多少个节点,节点处于什么样的状态,都运行着什么样的任务
–第二就是调度topology,当一个topology通过接口提交到集群上面之后,负责把topology里面的worker分配到supervisor上面去执行
Supervisor:每台机器会起一个supervisor进程,supervisor就是slave
–supervisor其实就干一件事情,就是启停worker,当nimbus调用之后,supervisor去把worker启动起来,这样的话worker就可以开始干活了。
Worker:实际干活的是worker,每个机器上面supervisor会启动很多个worker,每个机器会配置一定的worker,比如4个worker
–一个worker,其实就是一个JVM,JVM做什么事情,其实就干两件事情,第一件事情就是启动executor,第二件事情它负责worker与worker之间,比如这里还有worker,这里还有worker,负责同一个topolopy中worker和worker之间的传输,task这些数据传输是通过worker来做的,topology和topology之间是没有任何相关性的。
Executor:真正干活的是worker里面的executor
–worker启动executor,那executor做什么事情,executor就是执行我们的Spout、Bolt里面的nextTuple()、execute()这些回调函数的,是真正运行的线程。
先来看看zookeeper。
zookeeper是nimbus和supervisor把里面读写一些原数据信息的,具体会写什么信息呢?
存储心跳,会把心跳写上去,具体读取心跳信息的人再去zookeeper上面去读取信息;
调度信息,错误信息,当task执行错误的时候,把错误的信息写到zookeeper上去,这样的话,在webUI上我们就可以读取这些信息,把情况给展示出来。
实际上,Storm用Zookeeper,使用的非常简单,它就把它当做一个高可用的KV来使用,storm使用zookeeper需求非常简单,就是说让整个集群别变成无状态的,就是任何节点挂了,受影响都不大,包括nimbus这种master进程挂掉的话,整个集群都还是能工作的,它要做到这一点就需要把状态信息元数据都存储到一个KV里面去,存储到一个系统里面去,最简单的就是一个KV就解决了,之所以选用zookeeper,是因为它是一个分布式的