大数据之实时计算框架—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 在延时时间内没有检测到元组是否处理完成,就会将该元组标记为处理失败,并会在稍后重新发送该元组。