1、Storm设计思想(Streams、Spouts、Bolts、Topology、Stream Groupings)
Streams:Storm将流数据Stream描述成一个无限的Tuple序列,这些Tuple序列会以分布式的方式并行地创建和处理
Spouts:Storm认为每个Stream都有一个源头,并把这个源头抽象为Spout
通常Spout会从外部数据源(队列、数据库等)读取数据,然后封装成Tuple形式,发送到Stream中。Spout是一个主动的角色,在接口内部有个nextTuple函数,Storm框架会不停的调用该函数
Bolts:Storm将Streams的状态转换过程抽象为Bolt。Bolt即可以处理Tuple,也可以将处理后的Tuple作为新的Streams发送给其他Bolt
Topology:Storm将Spouts和Bolts组成的网络抽象成Topology,它可以被提交到Storm集群执行。Topology可视为流转换图,图中节点是一个Spout或Bolt,边则表示Bolt订阅了哪个Stream。当Spout或者Bolt发送元组时,它会把元组发送到每个订阅了该Stream的Bolt上进行处理
Stream Groupings:Storm中的Stream Groupings用于告知Topology如何在两个组件间(如Spout和Bolt之间,或者不同的Bolt之间)进行Tuple的传送。每一个Spout和Bolt都可以有多个分布式任务,一个任务在什么时候、以什么方式发送Tuple就是由Stream Groupings来决定的
2、Storm集群的架构
Storm使用Zookeeper来作为分布式协调组件,负责Nimbus和多个Supervisor之间的所有协调工作。借助于Zookeeper,若Nimbus进程或Supervisor进程意外终止,重启时也能读取、恢复之前的状态并继续工作,使得Storm极其稳定
- Storm的工作流程
Storm进行单词统计的流程:(1)从Spout 中发送 Stream(每个英文句子为一个Tuple)。
(2)用于分割单词的 Bolt将接收的句子分解为独立的单词, 将单词作为Tuple的字段名发送出去。
(3)用于计数的 Bolt 接收表示单词的 Tuple,并对其进行统计。
(4)输出每个单词以及单词出现过的次数。
1)所有Topology任务的提交必须在Storm客户端节点上进行,提交后,由Nimbus节点分配给其他Supervisor节点进行处理
2)Nimbus节点首先将提交的Topology进行分片,分成一个个Task,分配给相应的Supervisor,并将Task和Supervisor相关的信息提交到Zookeeper集群上
3)Supervisor会去Zookeeper集群上认领自己的Task,通知自己的Worker进程进行Task的处理
4)说明:在提交了一个Topology之后,Storm就会创建Spout/Bolt实例并进行序列化。之后,将序列化的组件发送给所有的任务所在的机器(即Supervisor节点),在每一个任务上反序列化组件
4、流数据的概念、特征
概念:流数据,即数据以大量、快速、时变的流形式持续到达
特征:
- 数据快速持续到达,潜在大小也许是无穷无尽的
- 数据来源众多,格式复杂
- 数据量大,但是不十分关注存储,一旦经过处理,要么被丢弃,要么被归档存储
- 注重数据的整体价值,不过分关注个别数据
- 数据顺序颠倒,或者不完整,系统无法控制将要处理的新到达的数据元素的顺序