Storm 基本概念

概念

Storm 是一个免费并开源的分布式实时计算系统。利用Storm 可以很容易做到可靠地处理无限的数据流,像Hadoop 批量处理大数据一样,Storm 可以实时处理数据。

集群架构

在这里插入图片描述

Nimbus(master-代码分发给supervisor)

Storm 集群的Master 节点,负责分发用户代码,指派给具体的Supervisor 节点上的Worker 节点,去运行Topology 对应的组件(Spout/Bolt)的Task。

Supervisor(slave-管理worker进程的启动和终止)

Storm 集群的从节点,负责管理运行在Supervisor 节点上的每一个Worker 进程的启动和终止。通过Storm 的配置文件中的supervisor.slots.ports 配置项,可以指定在一个Supervisor 上最大允许多少个Slot,每个Slot 通过端口号来唯一标识,一个端口号对应一个Worker 进程(如果该Worker 进程被启动)。

Worker(具体处理组件逻辑的进程)

运行具体处理组件逻辑的进程。Worker 运行的任务类型只有两种,一种是Spout 任务,一种是Bolt 任务。

Task

worker 中每一个spout/bolt 的线程称为一个task. 在storm0.8 之后,task 不再与物理线程对应,不同spout/bolt 的task 可能会共享一个物理线程,该线程称为executor。

ZooKeeper

用来协调Nimbus 和Supervisor,如果Supervisor 因故障出现问题而无法运行Topology,Nimbus 会第一时间感知到,并重新分配Topology 到其它可用的Supervisor 上运行。

编程模型(spout->tuple->bolt)

strom 在运行中可分为spout 与bolt 两个组件,其中,数据源从spout 开始,数据以tuple 的方式发送到bolt,多个bolt 可以串连起来,一个bolt 也可以接入多个spot/bolt.运行时原理如下图。
在这里插入图片描述

Topology

Storm 中运行的一个实时应用程序的名称。将 Spout、 Bolt 整合起来的拓扑图。定义了 Spout 和Bolt 的结合关系、并发数量、配置等等。

Spout

在一个topology 中获取源数据流的组件。通常情况下spout 会从外部数据源中读取数据,然后转换为topology 内部的源数据。

Bolt

接受数据然后执行处理的组件,用户可以在其中执行自己想要的操作。

Tuple

一次消息传递的基本单元,理解为一组消息就是一个Tuple。

Stream

Tuple 的集合。表示数据的流向。

Topology运行

在Storm 中,一个实时应用的计算任务被打包作为Topology 发布,这同Hadoop MapReduce任务相似。但是有一点不同的是:在Hadoop 中,MapReduce 任务最终会执行完成后结束;而在Storm 中,Topology 任务一旦提交后永远不会结束,除非你显示去停止任务。计算任务Topology 是由不同的Spouts 和Bolts,通过数据流(Stream)连接起来的图。一个Storm 在集群上运行一个Topology 时,主要通过以下3 个实体来完成Topology 的执行工作。包括Worker(进程)、Executor(线程)、Task。
在这里插入图片描述

Worker(1个worker进程执行的是1个topology的子集)

1 个worker 进程执行的是1 个topology 的子集(注:不会出现1 个worker 为多个topology服务)。1 个worker 进程会启动1 个或多个executor 线程来执行1 个topology 的component(spout 或bolt)。因此,1 个运行中的topology 就是由集群中多台物理机上的多个worker 进程组成的。

Executor(executor是1个被worker进程启动的单独线程)

executor 是1 个被worker 进程启动的单独线程。每个executor 只会运行1 个topology 的1 个component(spout 或bolt)的task(注:task 可以是1 个或多个,storm 默认是1 个component 只生成1 个task,executor 线程里会在每次循环里顺序调用所有task 实例)。

Task(最终运行spout或bolt中代码的单元)

Task是最终运行spout 或bolt 中代码的单元(注:1 个task 即为spout 或bolt 的1 个实例,executor 线程在执行期间会调用该task 的nextTuple 或execute 方法)。topology 启动后,1个component(spout 或bolt)的task 数目是固定不变的,但该component 使用的executor 线程数可以动态调整(例如:1 个executor 线程可以执行该component 的1 个或多个task 实
例)。这意味着,对于1 个component 存在这样的条件:#threads<=#tasks(即:线程数小于等于task 数目)。默认情况下task 的数目等于executor 线程数目,即1 个executor 线程只运行1 个task。
在这里插入图片描述

Storm Streaming Grouping

Storm 中最重要的抽象,应该就是Stream grouping 了,它能够控制Spot/Bolt 对应的Task 以什么样的方式来分发Tuple,将Tuple 发射到目的Spot/Bolt 对应的Task。
在这里插入图片描述
目前,Storm Streaming Grouping 支持如下几种类型。

huffle grouping

随机分组,尽量均匀分布到下游Bolt 中将流分组定义为混排。这种混排分组意味着来自Spout 的输入将混排,或随机分发给此Bolt 中的任务。shuffle grouping 对各个task 的tuple 分配的比较均匀。

fields grouping

按字段分组,按数据中field 值进行分组;相同field 值的Tuple 被发送到相同的Task 这种grouping 机制保证相同field 值的tuple 会去同一个task。

all grouping(广播)

广播发送, 对于每一个tuple 将会复制到每一个bolt 中处理。

global grouping

全局分组,Tuple 被分配到一个Bolt 中的一个Task,实现事务性的Topology。Stream 中的所有的tuple 都会发送给同一个bolt 任务处理,所有的tuple 将会发送给拥有最小task_id 的bolt任务处理。

none grouping(不分组)

不关注并行处理负载均衡策略时使用该方式,目前等同于shuffle grouping,另外storm 将会把bolt 任务和他的上游提供数据的任务安排在同一个线程下。

direct grouping(直接分组 指定分组)

由tuple 的发射单元直接决定tuple 将发射给那个bolt,一般情况下是由接收tuple 的bolt 决定接收哪个bolt 发射的Tuple。这是一种比较特别的分组方法,用这种分组意味着消息的发送者指定由消息接收者的哪个task 处理这个消息。 只有被声明为Direct Stream 的消息流可以声明这种分组方法。而且这种消息tuple 必须使用emitDirect 方法来发射。消息处理者可以通过TopologyContext 来获取处理它的消息的taskid (OutputCollector.emit 方法也会返回taskid)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值