一、Storm体系结构与基本概念
Storm的集群表面上看和Hadoop的集群非常像。但是在Hadoop上面你运行的是MapReduce的Job,而在Storm上面你运行的是Topology。Storm和Hadoop一个非常关键的区别是Hadoop的MapReduceJob最终会结束,而Storm的Topology会一直运行(除非你显式地杀掉它)。
在storm的体系架构设计中Nimbus和Supervisor之间的通讯是依靠ZooKeeper来完成。并且Nimbus进程和Supervisor都是快速失败(fail-fast)和无状态的。可以用kill -9来杀死Nimbus和Supervisor进程,然后再重启它们,它们可以继续工作。
在Storm中有 Nimbus 、Supervisor、Topology 、Worker、Task、Tuple以及Stream等重要概念,弄清楚这些概念,有助于我们更好地学习和运用Storm。
- Topology
一个实时计算应用程序逻辑被封装在Topology对象中,类似Hadoop中的job,Topology会一直运行直到被显式杀死。
-
Nimbus
负责资源分配和任务调度,类似Hadoop中的JobTracker。
- Supervisor
负责接受Nimbus分配的任务,启动和停止自己管理的Worker进程。
- Worker
运行具体处理组件逻辑的进程。
- Executor
Executor为Worker进程中的具体的物理线程,同一个Spout/Bolt的Task可能会共享一个物理线程
- Task
每一个Spout/Bolt具体要干的活,各个节点之间进行Grouping的单位。
- Tuple
Storm中Tuple是消息传递的基本单元。
- Stream
在storm中源源不断传递的Tuple就组成了Stream。
- Spout
在Topology中产生源数据流的组件。通常Spout获取从Kafka、MQ等的数据,然后调用nextTuple函数,发射数据出去供Bolt消费。(启动后相当于死循环,不断得发射数据)
- Bolt
在Topology中接受Spout的数据然后执行处理的组件。Bolt在接收到消息后会调用execute函数,用户可以在其中执行自己想要的操作。
- Grouping
在Storm中还一个重要的概念需要我们掌握,特别是在利用storm编程解决业务问题的时候会遇到的,如何根据不同的业务场景要求对数据进行消息partition控制,也就是Storm的Grouping,Storm有很多种Grouping包括:shuffle、fields、all、global、none、direct和localOrShuffle等,每一种有不同的partition控制场景。
ps:关于Storm的Grouping详细参考《Storm的Grouping类型总结》
二、Storm的优点
- 具有易用性
基于Storm的体系架构,只要我们遵守Topology,Spout,Bolt的编程规范即可开发出一个扩展性极好的应用,底层RPC,Worker之间冗余,数据分流之类的操作,开发者完全不用考虑,这就是框架的好处。
- 具有扩展性
当某一级处理单元速度不够,直接配置一下并发数,即可线性扩展性能。另外Storm本身是支持集群,可以很方便地添加服务器资源扩展集群规模。
- 具有健壮性
当Worker失效或机器出现故障时,自动分配新的Worker替换失效Worker。
- 具有准确性
一方面Storm采用Acker机制,保证数据不丢失,另外一方面Storm采用事务机制,保证数据准确性。