大数据之实时计算框架—Storm

Storm

DAG

有向无环图Directed Acyclic Graph(DAG)

  • 它由有限个顶点和有向边组成,每条有向边都从一个顶点指向另一个顶点;
  • 从任意一个顶点出发都不能通过这些有向边回到原来的顶点。
  • 有向无环图就是从一个图中的任何一点出发,不管走过多少个分叉路口,都没有回到原来这个点的可能性

条件

  • 每个顶点出现且只出现一次
  • 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。

计算一个DAG的拓扑关系

  • 1→4表示4的入度+1,4是1的邻接点
  • 首先将边与边的关系确定,建立好入度表和邻接表。
  • 从入度为0的点开始删除,如上图显然是1的入度为0,先删除。
  • 判断有无环的方法,对入度数组遍历,如果有的点入度不为0,则表明有环。
  • { 1, 2, 4, 3, 5 }

Storm介绍

Storm的简介

  • 分布式实时大数据处理框架,被业界称为实时版Hadoop
  • 流处理,不能进行批处理

Storm的优点

  • Storm 实现的一些特征决定了它的性能和可靠性的
  • Storm 的一个最有趣的地方是它注重容错和管理
  • 如果一个元组还未处理会自动从Spout处重发,Storm 还实现了任务级的故障检测,在一个任务发生故障时,消息会自动重新分配以快速重新开始处理

Storm的特性

  • 适用场景广泛

  • 可伸缩性高

    • Storm的可伸缩性可以让storm每秒可以处理的消息量达到很高。
    • Storm使用ZooKeeper来协调集群内的各种配置使得Storm的集群可以很容易的扩展。
  • 保证无数据丢失

    • 实时系统必须保证所有的数据被成功的处理。storm保证每一条消息都会被处理
  • 异常健壮

    • storm集群非常容易管理,轮流重启节点不影响应用。
  • 容错性好:

    • 在消息处理过程中出现异常, storm会进行重试
  • 语言无关性:

    • Storm的topology和消息处理组件(Bolt)可以用任何语言来定义, 这一点使得任何人都可以使用storm

Storm的物理架构

nimbus

  • Storm的Master,负责资源分配和任务调度。一个Storm集群只有一个Nimbus。
  • 集群的主节点,对整个集群的资源使用情况进行管理
  • 但是nimbus是一个无状态的节点,所有的一切都存储在Zookeeper

supervisor

  • Storm的Slave,负责接收Nimbus分配的任务,管理所有Worker
  • 一个Supervisor节点中包含多个Worker进程。默认是4个
  • 一般情况下一个topology对应一个worke

woker

  • 工作进程(Process),每个工作进程中都有多个Task

Task

  • 在 Storm 集群中每个 Spout 和 Bolt 都由若干个任务(tasks)来执行。
  • worker中每一个spout/bolt的线程称为一个task
  • 同一个spout/bolt的task可能会共享一个物理线程(Thread),该线程称为executor

Storm的并行机制

  • Topology由一个或多个Spout/Bolt组件构成。运行中的Topology由一个或多个Supervisor节点中的Worker构成

  • 默认情况下一个Supervisor节点运行4个Worker,由defaults.yaml/storm.yaml中的属性决定

    • supervisor.slots.ports:6700 6701 6702 6703
    • 在代码中可以使用new Config().setNumWorkers(3),最大数量不能超过配置的supervisor.slots.ports数量。
  • Worker为特定拓扑的一个或多个组件Spout/Bolt产生一个或多个Executor。默认情况下一个Worker运行一个Executor。

  • Executor为特定拓扑的一个或多个组件Spout/Bolt实例运行一个或多个Task。默认情Executor运行一个Task况下一个

配置拓扑的并行度

Storm的计算架构

概述

  • 流式计算框架

    • 客户端将数据发送给MQ(消息队列),然后传递到Storm中进行计算
    • 最终计算的结果存储到数据库中(HBase,Mysql)
    • 客户端不要求服务器返回结果,客户端可以一直向Storm发送数据
    • 客户端相当于生产者,Storm相当于消费者

Topology

  • 计算拓扑
  • Storm 的拓扑是对实时计算应用逻辑的封装,它的作用与 MapReduce 的任务(Job)很相似,
  • 区别在于 MapReduce 的一个 Job 在得到结果之后总会结束,而拓扑会一直在集群中运行,直到你手动去终止它。
  • 拓扑还可以理解成由一系列通过数据流(Stream Grouping)相互关联的 Spout 和 Bolt 组成的的拓扑结构。

Stream

  • 数据流(Streams)是 Storm 中最核心的抽象概念。
  • 一个数据流指的是在分布式环境中并行创建、处理的一组元组(tuple)的无界序列。
  • 数据流可以由一种能够表述数据流中元组的域(fields)的模式来定义。

Tuple

  • Stream中最小数据组成单元
  • 每个tuple可以包含多列,字段类型可以是: integer, long, short, byte, string, double, float,
  • boolean和byte array。

Spout

  • 数据源(Spout)是拓扑中数据流的来源。

  • 一般 Spout 会从一个外部的数据源读取元组然后将他们发送到拓扑中。

  • 根据需求的不同,Spout 既可以定义为可靠的数据源,也可以定义为不可靠的数据源。

  • 一个可靠的 Spout能够在它发送的元组处理失败时重新发送该元组,以确保所有的元组都能得到正确的处理

    • storm在检测到一个tuple被整个topology成功处理的时候调用ack, 否则调用fail
  • 不可靠的 Spout 就不会在元组发送之后对元组进行任何其他的处理。

  • 一个 Spout可以发送多个数据流。

Bolt

  • 拓扑中所有的数据处理均是由 Bolt 完成的。

  • 通过数据过滤(filtering)、函数处理(functions)、聚合(aggregations)、联结(joins)、数据库交互等功能

  • 一个 Bolt 可以实现简单的数据流转换,而更复杂的数据流变换通常需要使用多个 Bolt 并通过多个步骤完成。

  • 第一级Bolt的输出可以作为下一级Bolt的输入。而Spout不能有上一级。

  • Bolt 几乎能够完成任何一种数据处理需求。

  • Bolts的主要方法是execute(死循环)连续处理传入的tuple,

    • 成功处理完每一个tuple调用OutputCollector的ack方法,以通知storm这个tuple被处理完成了。
    • 处理失败时,可以调fail方法通知Spout端可以重新发送该tuple

StreamGroup

  • 为拓扑中的每个 Bolt 的确定输入数据流是定义一个拓扑的重要环节。
  • 数据流分组定义了在 Bolt 的不同任务(tasks)中划分数据流的方式。在 Storm 中有八种内置的数据流分组方式。

Reliablity

  • 可靠性
  • Storm 可以通过拓扑来确保每个发送的元组都能得到正确处理。
  • 通过跟踪由 Spout 发出的每个元组构成的元组树可以确定元组是否已经完成处理。
  • 每个拓扑都有一个“消息延时”参数,如果 Storm 在延时时间内没有检测到元组是否处理完成,就会将该元组标记为处理失败,并会在稍后重新发送该元组。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>