Storm研究综述

实时计算具备分布式、低延迟、高性能、可扩展、高容错、高可靠、消息严格有序、定制开发等特点。在整个计算过程中,实时计算引擎与各处理单元均处于运行状态,接收源源不断流进的消息,进行任务的分配、调度、路由、计算,最后将处理结果进行存储。

通常,实时计算引擎由数据读取、模型转换、逻辑处理等组件组成,数据读取组件从外部数据源源源不断的读取数据,然后依据内容数据模型转换为内部源数据,让后交由逻辑处理组件进行数据处理,处理内容包括了过滤、计算、合并、存储等操作,处理完毕后将结果写入目的数据源。

实时计算主要含有几个关键的特性:

(1) 数据处理的低延迟。对于实时计算的系统来说,最关键的指标就是计算的延迟,从输入到输出,整个并行处理的时间越少越好,基本需要延迟在毫秒级,才可以称得上是实时计算。

(2) 良好的系统容错性。由于延迟低、吞吐高,所以容错成了实时系统中的一个难点,各种故障有可能经常发生,而对每个数据就记录其负责的状态又太浪费存储资源,计算框架必须容忍故障的多发性。

(3) 很好的机器扩展能力。实时计算系统除了常规的扩展要求以外,还需要在扩展机器后,能同时不增加系统的延迟,不能因为满足高扩展而使得规模扩大明显降低系统的处理速度。

(4) 灵活的计算逻辑表达能力。实时计算系统需要在多阶段处理的任务中满足比较好的逻辑表达且不影响计算效率。

Storm 是一个分布式的、可靠的、容错的数据实时流式处理系统,Spout 是Storm 中的消息源, 用于为Topology 生产消息, 一般从外部数据源(如MessageQueue、RDBMS、NoSQL、Log)不间断地读取数据并发送Tuple 给Bolt 进行数据操作,Bolt 是Storm中的消息处理者,用于为Topology 进行消息处理,Bolt可以执行过滤、聚合、查询数据等操作,而且可以一级一级地进行处理。这种Topology 模型采用消息传递方式交互数据,数据量相比较从磁盘获取要小,而且动态地读取,每次读取量小。

Storm 的高可靠性和容错性主要集中体现在Storm的数据重发机制上,由于每个Bolt 可以启动多个task,每个task都会带有一个唯一标示的ID,Storm 将此ID持久化,在数据重发时候读取发送失败的task 的ID 状态,重发发送数据,保证了数据的一致性,这明显优于S4 实时流系统,而且Topology 递交之后,Storm 会一直运行直到主动释放Topology 或者kill 掉, 这明显要优于Hadoop 系统。Hadoop 的批处理和Storm 的实时流处理,本是两种不同的业务场景, 但是如果我们很好地进行融合和集成, 就会发现组合在一起的新型处理方案在性能和扩展性以及稳定性上都得到了提升。

Storm通常由主控节点(Master Node)和工作节点(Work Node)组成:

1、主控节点运行一个被称为Nimbus的后台程序,它负责在Storm集群内分发代码,分配任务给工作机器,并且负责监控集群运行状态;

2、工作节点运行一个被称为Supervisor的后台程序。Supervisor负责监听从Nimbus分配给它执行的任务,据此启动或停止执行任务的工作进程;

3、Nimbus和Supervisor节点之间所有的协调工作是通过Zookeeper集群来实现的。此外,Nimbus和Supervisor进程都是快速失败(fail-fast)和无状态(stateless)的;Storm集群所有的状态要么在Zookeeper集群中,要么存储在本地磁盘上。这种设计使得Storm集群拥有不可思议的稳定性;

4、Zookeeper存储客户端提供的topology任务信息,nimbus负责将任务分配信息写入Zookeeper,supervisor从Zookeeper上读取任务分配信息;存储supervisor和worker的心跳,使得nimbus可以监控整个集群的状态,从而重启一些挂掉的worker;存储整个集群的所有状态信息和配置信息;

5、topology:一个拓扑是一个个计算节点组成的图,每个节点包换处理的逻辑,节点之间的连线表示数据流动的方向;

6、spout:表示一个流的源头,产生tuple;

7、bolt:处理输入流并产生多个输出流,可以做简单的数据转换计算,复杂的流处理一般需要经过多个bolt进行处理;

8、stream grouping:即消息的partition方法,提供若干种实用的grouping方式,包括shuffle, fields hash, all, global, none, direct等;

9、stream:对数据进行的抽象,是时间上无界的tuple元组序列,Spout是Stream的源头,负责为Topology从特定数据源发射Stream;

10、tuple:表示流中一个基本的处理单元,可以包括多个field,每个filed表示一个属性;

11、Java序列化:client提交topology任务后,Storm将topology任务序列化并发送给nimbus;supervisor从Zookeeper取得任务信息后,从nimbus下载序列化文件和jar包,启动worker进程并反序列化得到提交任务时的topology对象。

Storm之于实时处理,就如Hadoop之于批处理。

Storm可用于实时计算、实时监控、实时统计等场景,通常与分布式数据库Hbase一起使用。Storm保证每个消息都会得到处理,而且它很快——在一个小集群中,每秒可以处理数以百万计的消息。

Storm架构主要由两种节点构成:Nimbus(主控节点)和Supervisor(工作节点)。集群由主控节点协调控制,主控节点主要负责分配计算任务、容灾控制和传输代码包等协调管理功能。集群中其它服务器机器作为工作节点,随时候命,等待主控节点的命令,根据其命令开启或停止负责的计算任务,每个工作节点可以作为多个拓扑任务的计算。

ZooKeeper集群也用作状态信息的存储,每次状态的改变,Nimbus和Supervisor都会把数据存储在集群上,这样所有节点都是无状态的服务,可以轻易的进行故障恢复,一旦有节点出现故障,可以随时在另一台机器上启动相同的服务节点,不会丢失任何状态信息,防止Storm 集群的不可恢复。但是这里的故障恢复指的是Storm 的管理状态信息,具体计算任务的状态信息还需要用户自己存储。

Storm 的DAG 拓扑结构中,计算节点分为两类,一类是计算任务的数据输入节点Spout,它负责和外部进行数据传输,转换数据格式,然后把输入的数据发到下游的计算节点中,外部输入一般是Kafka类似的消息系统。另一类是进行具体计算的节点Bolt,Bolt 接收上游传输过来的数据,进行用户定义的计算,产生衍生的数据,并发传输到下游节点,Bolt 之间通过特定的接收方式串接起来构成一个DAG图。计算任务往往是可以分解的,可以将复杂的计算任务分解成多个计算节点构成的DAG图,计算节点之间通过拓扑结构嵌套关联起来,Storm 的DAG 结构中比较常见的一些基本拓扑结构包含:流水线、随机分组、直接分组、全部分组和字段分组。流水线(Pipeline)就是将多个计算任务通过数据流连接起来,每个节点只专注自己的工作。

随机分组(Shuffle grouping)是指并发的两个计算任务之间比较均衡的拓扑结构。直接分组(Direct grouping)是一个特殊的拓扑结构,上游节点可以获取到下游节点的每个编号,它将由用户动态指定数据的目的地。

全部分组(All grouping)在数据分发模式上和其它的结构都不同,在分发数据时,会把数据拷贝多份,发往每一个下游节点中。

字段分组(Fields grouping)和随机分组在基本结构上类似,不同的是在发送数据时下游节点的选取上,随机分组随机的选取下游节点,而字段分组是通过定义的某个或某些字段来进行特殊计算后得到的下游节点,具体的计算可能是哈希后取余的方式,也可以是一致性哈希的方式。字段分组保证了拥有相同字段的数据可以被分发到固定的计算节点中。

Storm 支持“至少送达一次”的语义,Storm 使用一种特殊的Acker 节点实现送达保证,Acker 节点会追踪Spout 节点发射的每个数据,进而通知Spout 节点数据的完成情况。Spout 节点在发射数据时会赋予一个随机的64 位的消息ID,Acker 会维护ID和追踪值的Key/Value 对,当追踪值为零时表示数据处理完成,当此值超时通知Spout 重发。Bolt 节点接收到数据时会通知Acker 使用相同的ID 来对相应的追踪值进行异或(XOR)操作,Bolt 节点产生的数据,也会生成随机的ID 值。这样,如果其追踪值变为数值零,则表示Storm 已经成功处理完成这条数据,而超时则代表处理失败。使用异或的方式来实现送达保证并不能保证完全的可靠,因为有不同的数异或等于零的情况,但是这种情况可能性非常低,小到可以忽略不计,绝大多数场景都没有什么问题。

Storm是成熟的实时计算引擎,具备如下特点:

1、简单的编程模型:降低并行批处理复杂性,降低实时处理复杂性;

2、支持各种编程语言:可以使用各种编程语言,需要支持Java、Ruby、Python等,并可以通过增加通信协议的方式增加对新语言的支持;

3、支持容错:管理工作进程和节点的故障;

4、支持水平扩展:计算是在多个线程、进程和服务器之间并行进行的;

5、可靠的消息处理:保证每个消息至少能得到一次完整处理。任务失败时,它会负责从消息源重试消息;

6、高效消息处理:系统设计保证消息能得到快速的处理,使用队列作为其底层消息队列。

Storm最大的缺点是不支持批计算模型,很多过程需要拿到一定量的数据之后才可以开始计算,比如说数据的批量更新,如果简单的把历史数据保存在内存中,就会有数据丢失的风险。Trident是构建在Storm底层计算引擎上的一个以实时计算为目标的高级抽象,对Storm进行了批处理的封装,提供了易于理解的算子层,开发者可以进行类似Spark的算子运算,而不用关心底层逻辑。Tident提供了joins、aggregations、grouping、functions,以及filters等能力。除此之外,Trident 还提供了一些专门的原语,从而在基于数据库或者其他存储的前提下应付有状态的递增式处理。

Storm使用元组来作为它的数据模型,它可以看作一个没有方法java对象 。 每个元组由若干值成,支持任何类型包括常见的基本类型、字符类型等,甚至可以使用其他自定义的序列化类型,且每个值都有一个名字。一个元组代表数据流中的一个最基本的处理单元,比如一条日志,它可以包含多个列,每个列表示一个属性。元组只需要按序填入各个值,事先已经定义好各个组件间传递的元组的字段名称,一个元组就是值列表列表中的每个值都有一个名字,节点通过订阅标签可以接受处理单元。

Storm作为一个开源的实时分布式计算平台,有着以下几个优点:(1)其简单的编程模型降低了开发人员开发的难度,能够实现了快速、高效的开发应用;(2)Storm系统支持各种编程语言,默认支持clojureJavaRuby和脚hon。若需要实现对其他语言的支持,通过实现一个简单的stom通信协议就可以完成;(3)Storm系统具备高容错性,当某个任务失败时,Storm将会从消息源重新获取消息进行处理,这种方式能够保障spout发出的每条消息都被正确处理。Storm系统采用了发送方和应答方都需与系统内部的第三方acker进行异或随机数的方式来判断tuple是否丢失,若acker上记录的消息随机数为1则认为消息处理失败,acker将通知spout进行重放;(4)Stom系统支持水平扩展,只要增加节点即可增加其吞吐量并且减少时延;(5)Stmm系统支持本地模式,Storm系统能在进程中模拟Storm集群,提供集群所有的功能,即在单机上运行的topology和集群上运行topology,相似;(6)Storm系统采用了zeroMQ作为底层消息队列,保障了获取的消息能够被快速处理。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值