Apache Storm体系结构

原则上,zookeeper应该在Nimbus和Supervisor之间,负责将集群状态信息以及Task和Supervisor映射关系存放在zookeeper集群上

简述storm的工作流程 storm的工作流程包括_简述storm的工作流程

Apache Storm的相关术语

  • Streams:是一个由无限制的Tuple序列组成,由传送方和接收方规定好传送的名称,这个名称可以是基本类型,数组类型等等。将流数据抽象为无限的Tuple序列

  • Spout:被认为是一个或多个Stream的源头,可以是Mysql等数据库或者网络日志信息等。将这些数据源的信息转换成实际的Tuple流。

  • Blot:被认为是数据处理逻辑

  • Topology:Topology是由Spouts,Streams以及Blots组成的拓扑结构, 边表示Blot订阅了哪个Stream,当Spout或者Blot向Stream发送了Tuple时,将把这一系列Tuple发送给订阅了该Stream的Blot。Topology是运行在Storm上的作业,就像MapReduce作业运行在hadoo。Topology作业没有主动取消或者特殊情况是不会停止的,MapReduce作业需要在一定事件内完成。

简述storm的工作流程 storm的工作流程包括_storm_02


  • Stream Grouping:定义了消息分发策略,也定义了Blot以什么形式接收数据,告知Topology如何在Spout和Blot之间传送Tuple会这不同Blot之间传送Tuple。每一个Spout和Blot都可以有多个Task,一个Task如何发送Tuple就是由Stream Grouping决定的。
  1. 随机分组(Shuffle Grouping, 随机分组 ):保证每一个Blot和Task接收Tuple数量大概一样
  2. 根据字段值分配(Fields Grouping, 字段分组 ): 按照相同字段下的值对应的Tuple分配到一个Task中
  3. 广播(AllGrouping, 全部分组 ),所有Task都会收到Tuple
  4. 全局分组 ( GlobalGrouping,全局分组 ),所有Tuple总是发给同一个Task
  5. 不关心数据是如何分组的(None Grouping, 无分组 ),和随机分组类似
  6. 直接分组( DirectGrouping, 直接分组 )由自定义逻辑来决定,即由消息发送者决定应该由消息接收者组件的哪个Task来处理该消息。

    图中只是画出了一个Stream Grouping过程,实际上么一个Task都会有这种的过程

Apache Storm的基本结构

Apache Storm是分布式实时计算系统,其组成结构如下:

简述storm的工作流程 storm的工作流程包括_storm_03

  • Nimbus是主结点运行的后台进程,负责在集群分发代码,布置任务,监测故障。
  • Supervisor是从结点运行的后台进程,用于监听工作,开始和终止工作进进程。
  • Nimbus与Supervisor之间的协调工作是通过ZooKeeper来完成,Nimbus和Superviso所在的结点并不直接通信,而是由Zookeeper将其状态信息放入本地磁盘或Zookeeper中,一旦发生故障,会通过ZooKeeper来恢复。就算Nimbus和Supervisor被终止,也可以恢复到以前的状态。

Worker进程:Worker由Supervisor负责启动,一个Worker中可以有多个Executor线程,每个Executor线程中又可包含一个或多个Task,Task包括了用户处理逻辑。实际的数据处理是Task完成的。

简述storm的工作流程 storm的工作流程包括_storm_04


每一个Topology的组件都可以设置为不同的并行度,也就是说在系统中,可以存在多个Spout及Bolt, 且每个Spout或Bolt都可设置不同的并行度。比如某个Blot并行度是3,这个Bolt中的任务可能被分发到不同的3个Worker结点上的线程中进行分布式并行处理。

简述storm的工作流程 storm的工作流程包括_分布式_05


Apache Storm工作流程

简述storm的工作流程 storm的工作流程包括_简述storm的工作流程_06

  1. 所有Topology任务的提交必须在Storm客户端节点(可以认为自己编写程序所在的机器)上进行,提交到Nimbus
  2. Nimbus节点首先将提交的Topology进行分片,分成一个个Task,通过Zookeeper分配给对应的Supervisor,并将Task和Supervisor映射关系信息表提交到Zookeeper集群上
  3. Supervisor会主动去Zookeeper所在集群上认领自己的Task,通知自己的Worker进程进行Task的处理
  4. Supervisor启动Worker,然后启动相应的Executor处理Task

序列化: Java语言中序列化就是指把Java对象转换为字节序列的过程,目的是能将对象能够在网络上传输。
反序列化: Java反序列化就是指把字节序列恢复为Java对象的过程。

提交Topology,编写的Blot类和Spout类都会被创建为对象的形式运行才能进行相关的计算任务。

  1. 需要将Spout和Blot创建的对象进行序列化在网络中进行传输。
  2. 相应的从结点进行反序列化得到相应的对象,也就是相应的用户处理逻辑,分发给Task进行处理。