Storm拥有低延迟、高性能、分布式、可扩展、容错等特性,可以保证消息不丢失,消息处理严格有序。Storm的主要特点如下所示:
Storm集群由 一个主节点 和 多个工作节 点组成。主节点运行了一个名为“ Nimbus ”的守护进程,用于分配代码、布置任务及故障检测。每个工作节点都运行了一个名为“ Supervisor ”的守护进程,用于监听工作,开始并终止工作进程。Nimbus和Supervisor都能 快速失败 ,而且是 无状态 的,这样一来它们就变得十分健壮,两者的协调工作是由 Apache ZooKeeper 来完成的。
图1.1 Storm工作流程
第一步:客户端提交拓扑到Nimbus。第二步:Nimbus针对该拓扑建立本地的目录根据topology的配置计算task,分配task,在zookeeper上建立assignments节点存储task和supervisor机器节点中woker的对应关系。第三步:在zookeeper上创建taskbeats节点来监控task的心跳,启动topology。第四步:Supervisor去zookeeper上获取分配的tasks,启动多个woker进行,每个woker生成task,一个task一个线程;根据topology信息初始化建立task之间的连接;Task和Task之间是通过ZeroMQ管理的;后整个拓扑运行起来。
Storm的术语包括Stream、Spout、Bolt、Task、Worker、Stream Grouping和Topology。 Stream 是被处理的数据。 Sprout 是数据源。 Bolt 处理数据。 Task 是运行于Spout或Bolt中的线程。 Worker 是运行这些线程的进程。 Stream Grouping 规定了Bolt接收什么东西作为输入数据。数据可以随机分配(术语为Shuffle),或者根据字段值分配(术语为Fields),或者 广播(术语为All),或者总是发给一个Task(术语为Global),也可以不关心该数据(术语为None),或者由自定义逻辑来决定(术语为Direct)。Topology是由Stream Grouping连接起来的Spout和Bolt节点网络。
可以和Storm相提并论的系统有Esper、Streambase、HStreaming和Yahoo S4。其中和Storm最接近的就是S4。两者 最大的区别 在于Storm会保证消息得到处理。这些系统中有的拥有 内建数据 存储层,这是Storm所 没有 的,如果需要持久化,可以使用一个类似于Cassandra或Riak这样的外部数据库。