- Storm的整体架构
- Numbus:为主节点,主要负责任务的提交,集群任务的分配,以及集群的监控
- Zookeeper集群:存放心跳信息,集群状态,配置信息,接收来自Numbus要分发给Supervisor的任务
- Supervisor:负责从Zookeeper领取Numbus分发的任务,启动和停止自己管理的worker进程
- Worker:负责运行处理业务逻辑的Executor
- Task:worker中每一个 Spout /bolt的线程称为一个task. 在 Storm 0.8之后,task不再与物理线程对应,同一个 Spout /bolt的task可能会共享一个物理线程,该线程称为executor
2. Storm基本组件
以wordcount为例,介绍相关组件:
Topology: Storm 中运行的一个实时应用程序,因为各个组件间的消息流动形成逻辑上的一个拓扑结构 ,有序五环图,在这里我把整个wordcount设计为WordCountTopology
Spout:在一个topology中负责从数据源读取数据,产生源数据流的组件。通常情况下 Spout 会从外部数据源中读取数据,然后转换为topology内部的源数据。 Spout 是一个主动的角色,其接口中有个nextTuple()函数, Storm 框架会不停地调用此函数,用户只要在其中生成源数据即可。这里我们将会创建SentenceSpout,负责读取源数据,然后封装成tuple,传递给SplitBolt处理。
Tuple:一次消息传递的基本单元。
Bolt:接收来自Spout发送过来的tuple,然后执行处理的组件。Bolt可以执行过滤、函数操作、合并、写数据库等任何操作。Bolt是一个被动的角色,其接口中有个execute(Tuple input)函数,在接受到消息后会调用此函数,用户可以在其中执行自己想要的操作。
Stream Grouping:即消息的partition方法。流分组策略告诉topology如何在两个组件之间发送tuple。 Storm 中提供若干种实用的grouping方式,总共有七种方式:
- ShuffleGrouping(随机分组)
- FieldsGrouping(按照字段分组,在这里即是同一个单词只能发送给一个Bolt)
- AllGrouping(广播发送,即每一个Tuple,每一个Bolt都会收到)
- GlobalGrouping(全局分组,将Tuple分配到task id值最低的task里面)
- NoneGrouping(随机分派)
- DirectGrouping(直接分组,指定Tuple与Bolt的对应发送关系)
- LocalOrShuffleGrouping
- CustomGrouping (自定义的Grouping)