Storm是一个开源的分布式的大数据实时计算系统。它的使用场景有数据的实时、持续计算和分布式RPC等。
它是分布式的、可以扩展、具有高可靠性和容错性、计算快速实时、低延迟,而且它的编程模型简单,还有可靠的消息处理。
Nimbus:Storm集群的Master节点,负责分发用户代码,指派给具体的Supervisor节点上的Worker节点,去运行Topology对应的组件的Task。
Supervisor :Storm集群的从节点,负责管理运行在Supervisor节点上的每一个Worker进程的启动和终止。通过Storm的配置文件中的supervisor.slots.ports配置项,可以指定在一个Supervisor上最大允许多少个Slot,每个Slot通过端口号来唯一标识,一个端口号对应一个Worker进程(如果该Worker进程被启动)。
ZooKeeper:用来协调Nimbus和Supervisor,如果Supervisor因故障出现问题而无法运行Topology,Nimbus会第一时间感知到,并重新分配Topology到其它其它可用的Supervisor上运行。
Storm提交运行的程序称为Topology。而Topology处理的最小的消息单位是一个Tuple,也就是一个任意对象的数组。Topology由Spout和Bolt构成。Spout是发出Tuple的结点。Bolt可以随意订阅某个Spout或者Bolt发出的Tuple。
在一个Strom集群中,实际运行一个topology有三个主要的实体。
Topology 计算拓补, 一个实时计算应用程序的逻辑在storm里面被封装到topology对象里面,Storm里面的topology相当于Hadoop里面的一个MapReduce Job,它们的关键区别是:一个MapReduce Job最终总是会结束的, 然而一个storm的topoloy会一直运行,除非你显式的杀死它。
Spout 消息源,消息源Spouts是storm里面一个topology里面的消息生产者。一般来说消息源会从一个外部源读取数据并且向topology里面发出消息 tuple。 消息源Spouts可以是可靠的也可以是不可靠的。如果这个tuple没有被storm成功的处理,那么可靠的消息源可以重新发射一个tuple ,不可靠的消息源Spouts一旦发出一个tuple就把它彻底忘了。
Bolt 消息处理者: 所有的消息处理逻辑被封装在bolts里面。Bolts可以做很多事情: 过滤, 聚合, 查询数据库等等。Bolts的主要方法是execute,它以一个tuple作为输入,Bolts使用OutputCollector来发射tuple, Bolts必须要为它处理的每一个tuple调用OutputCollector的ack方法,以通知storm这个tuple被处理完成了。– 从而我们通知这个tuple的发射者Spouts。 一般的流程是:Bolts处理一个输入tuple, 发射0个或者多个tuple,然后调用ack通知storm自己已经处理过这个tuple了。