storm:
Storm可用于许多领域中,如实时分析、在线机器学习、持续计算、远程RPC、数据提取加载转换等
Storm具有以下主要特点:
整合性
简易的API
可扩展性
可靠的消息处理
支持各种编程语言
快速部署
免费、开源
storm主要包括:Streams、Spouts、Bolts、Topology和Stream Groupings;
stream:Storm将流数据Stream描述成一个无限的Tuple序列,这些Tuple序列会以分布式的方式并行地创建和处理;
每个tuple是一堆值,每个值有一个名字,并且每个值可以是任何类型
Tuple本来应该是一个Key-Value的Map,由于各个组件间传递的tuple的字段名称已经事先定义好了,所以Tuple只需要按序填入各个Value,所以就是一个Value List(值列表)
Spout:Storm认为每个Stream都有一个源头,并把这个源头抽象为Spout;
通常Spout会从外部数据源(队列、数据库等)读取数据,然后封装成Tuple形式,发送到Stream中。Spout是一个主动的角色,在接口内部有个nextTuple函数,Storm框架会不停的调用该函数
Bolt:Storm将Streams的状态转换过程抽象为Bolt。Bolt即可以处理Tuple,也可以将处理后的Tuple作为新的Streams发送给其他Bolt;
Bolt可以执行过滤、函数操作、Join、操作数据库等任何操作
Bolt是一个被动的角色,其接口中有一个execute(Tuple input)方法,在接收到消息之后会调用此函数,用户可以在此方法中执行自己的处理逻辑;
Topology:Storm将Spouts和Bolts组成的网络抽象成Topology,它可以被提交到Storm集群执行。
Topology可视为流转换图,图中节点是一个Spout或Bolt,边则表示Bolt订阅了哪个Stream。当Spout或者Bolt发送元组时,它会把元组发送到每个订阅了该Stream的Bolt上进行处理;
Topology里面的每一个组件都是并行运行的;
在Topology里面可以指定每个组件的并行度, Storm会在集群里面分配那么多的线程来同时计算
在Topology的具体实现上,Storm中的Topology定义仅仅是一些Thrift结构体(二进制高性能的通信中间件),支持各种编程语言进行定义
Stream Groupings:Storm中的Stream Groupings用于告知Topology如何在两个组件间(如Spout和Bolt之间,或者不同的Bolt之间)进行Tuple的传送。每一个Spout和Bolt都可以有多个分布式任务,一个任务在什么时候、以什么方式发送Tuple就是由Stream Groupings来决定的
(1)ShuffleGrouping:随机分组,随机分发Stream中的Tuple,保证每个Bolt的Task接收Tuple数量大致一致
(2)FieldsGrouping:按照字段分组,保证相同字段的Tuple分配到同一个Task中
(3)AllGrouping:广播发送,每一个Task都会收到所有的Tuple
(4)GlobalGrouping:全局分组,所有的Tuple都发送到同一个Task中
(5)NonGrouping:不分组,和ShuffleGrouping类似,当前Task的执行会和它的被订阅者在同一个线程中执行
(6)DirectGrouping:直接分组,直接指定由某个Task来执行Tuple的处理
节点方式:
Numbus/Supervisor;类似于Master/Slave;
storm用Zookeeper来作为分布式协调组件,负责Nimbus和多个Supervisor之间的所有协调工作。借助于Zookeeper,若Nimbus进程或Supervisor进程意外终止,重启时也能读取、恢复之前的状态并继续工作,使得Storm极其稳定;
Worker进程:
(1)Worker进程:每个worker进程都属于一个特定的Topology,每个Supervisor节点的worker可以有多个,每个worker对Topology中的每个组件(Spout或 Bolt)运行一个或者多个executor线程来提供task的运行服务
(2)Executor:executor是产生于worker进程内部的线程,会执行同一个组件的一个或者多个task。
(3)Task:实际的数据处理由task完成
工作流程:
所有Topology任务的提交必须在Storm客户端节点上进行,提交后,由Nimbus节点分配给其他Supervisor节点进行处理
Nimbus节点首先将提交的Topology进行分片,分成一个个Task,分配给相应的Supervisor,并将Task和Supervisor相关的信息提交到Zookeeper集群上
Supervisor会去Zookeeper集群上认领自己的Task,通知自己的Worker进程进行Task的处理