Storm技术介绍 2015-07-23 15:50

介绍

Storm是一个开源的分布式实时计算框架。最早由Twitter开发。开源语言是Java。Storm主要的应用场景的实时计算、实时分析和实时推荐。

架构

我画的架构图:

说明:

  • Client客户端向Nimbus提交业务拓扑
  • Nimbus负责接收客户端提交任务,并在集群中分发任务给Supervisor。同时监听状态等。
  • Supervisor负责监听并接受Nimbus分配的任务,根据需要启动和停止属于自己管理的Worker进程。
  • Worker进程是运行具体处理组件逻辑的进程。每个Worker是一个JVM进程。其中,每个Executor为一个线程。Executor中有一个或多个Task(默认一个Executor一个Task),Task处理具体业务逻辑。
  • ZooKeeper为服务中各进程提供分布式协作服务。Nimbus、Supervisor、Worker将自己的信息注册到ZooKeeper中,Nimbus据此感知各个角色的健康状态。

概念

  • Nimbus:负责资源分配和任务调度。常驻进程。
  • Supervisor:负责接受nimbus分配的任务,启动和停止属于自己管理的worker进程。常驻进程。
  • Worker:运行具体处理组件逻辑的进程。非常驻进程,由Supervisor根据需求拉起。
  • Topology:Storm中运行的一个实时应用程序。
  • Spout:在一个Topology中产生源数据流的组件。说白了就是一段业务逻辑代码。
  • Bolt:在一个Topology中接受数据然后执行处理的组件。也是一段业务逻辑代码。
  • Task:Worker中每一个Spout/Bolt的线程称为一个Executor,Executor中的处理单元叫Task。一个Executor有一个或多个Task。
  • Streams:Streams是无限的Tuple序列,是一种消息流向。
  • Tuple:一次消息传递的基本单元,一组键值对。
  • Stream grouping:同一个Stream中的消息分组方法。

Topology

  • 业务处理逻辑被封装进Stopology中。
  • 一个topology是由一组Spout组件(数据源)和Bolt组件(逻辑处理)通过Stream Groupings进行连接的有向无环图(DAG)。

一个topology会一直运行,直到你kill它。 Spout是Storm的消息源,是Topology的消息生产者。一般来说消息源会从一个外部源读取数据,并向Topology中发送消息(Tuple)。比如一个spout可能从Kafka队列里面读取消息并且把这些消息变成一个流。 Bolt可以接收任意多个输入Stream。有些Bolt可能还会发出一些新的Stream。一些复杂的流转换,比如从一些微博消息里面计算出热门话题,需要多个步骤,从而也就需要多个Bolt。Bolt可以做任何事情:运行函数,过滤tuple,做一些聚合,做一些合并以及访问数据库等等。 Stream groupings声明每个Bolt接受怎么样的流作为输入,Stream grouping定义一个Stream应该如何分配给该Bolt上面的多个Task。

Topology里面的每一个Component(Spout/Bolt)节点都是并行运行的。在topology里面,可以指定每个节点的并行度, Storm则会在集群里面分配相应的Task来同时计算,以增强系统的处理能力。

Worker:一个Worker是一个JVM进程,所有的Topology都是在一个或者多个Worker中运行的。 Executor:在一个单独的Worker进程中会运行一个或多个Executor线程。每个Executor只会运行一个Topology的一个Spout或者Bolt的task实例 Task:是最终完成数据处理的实体单元

Stream Grouping

所谓Stream Grouping,就是消息的分发策略。

  1. Shuffle grouping(随机分组): 随机分发Tuple到Bolt的任务,保证每个任务获得相等数量的tuple。
  2. Fields grouping(字段分组):根据指定字段分割数据流,并分组。例如,根据"user-id"字段,相同"user-id"的元组总是分发到同一个任务,不同"user-id"的元组可能分发到不同的任务。
  3. All grouping(全部分组):Tuple被复制到bolt的所有任务。这种类型需要谨慎使用。
  4. Global grouping(全局分组):全部流都分配到bolt的同一个任务。明确地说,是分配给ID最小的那个task。
  5. None grouping(无分组):你不需要关心流是如何分组。目前,无分组等效于随机分组。但最终Storm将把无分组的Bolts放到Bolts或Spouts订阅它们的同一线程去执行(如果可能)。
  6. Direct grouping(直接分组):这是一个特别的分组类型。元组生产者决定tuple由哪个元组处理者任务接收。
  7. LocalOrShuffle Grouping: Tuple会优先被发送到与消息发送者在同一个Worker进程中的接收task中.

当然还可以实现CustomStreamGroupimg接口来定制自己需要的分组。

参考文档

  1. storm 原理简介及单机版安装指南
Tags: #Storm    Post on Streaming