静态数据:为了支持决策分析而构建的数据仓库系统,其中存放的大量历史数据就是静态数据。html
流数据:以大量、快速、时变的流形式持续到达的数据。(例如:实时产生的日志、用户实时交易信息)数据库
流数据具备如下特色:apache
(1)、数据快速持续到达,潜在大小也许是无穷无尽的。 (2)、数据来源众多,格式复杂。 (3)、数据量大,可是不十分关注存储,一旦通过处理,要么被丢弃,要么被归档存储(存储于数据仓库)。 (4)、注重数据的总体价值,不过度关注个别数据。 (5)、数据顺序颠倒,或者不完整,系统没法控制将要处理的新到达的数据元素的顺序。编程
在传统的数据处理流程中,老是先收集数据,而后将数据放到DB中。而后对DB中的数据进行处理。缓存
流计算:为了实现数据的时效性,实时消费获取的数据。数据结构
批量计算:充裕时间处理静态数据,如Hadoop。实时性要求不高。架构
流计算:实时获取来自不一样数据源的海量数据,通过实时分析处理,得到有价值的信息(实时、多数据结构、海量)。框架
流计算秉承一个基本理念,即数据的价值随着时间的流逝而下降,如用户点击流。所以,当事件出现时就应该当即进行处理,而不是缓存起来进行批量处理。流数据数据格式复杂、来源众多、数据量巨大,不适合采用批量计算,必须采用实时计算,响应时间为秒级,实时性要求高。批量计算关注吞吐量,流计算关注实时性。分布式
流计算的特色:函数
一、实时(realtime)且无界(unbounded)的数据流。流计算面对计算的 是实时且流式的,流数据是按照时间发生顺序地被流计算订阅和消费。且因为数据发生的持续性,数据流将长久且持续地集成进入流计算系统。例如,对于网站的访问点击日志流,只要网站不关闭其点击日志流将一直不停产生并进入流计算系统。所以,对于流系统而言,数据是实时且不终止(无界)的。
二、持续(continuos)且高效的计算。流计算是一种”事件触发”的计算模式,触发源就是上述的无界流式数据。一旦有新的流数据进入流计算,流计算马上发起并进行一次计算任务,所以整个流计算是持续进行的计算。
三、流式(streaming)且实时的数据集成。流数据触发一次流计算的计算结果,能够被直接写入目的数据存储,例如将计算后的报表数据直接写入RDS进行报表展现。所以流数据的计算结果能够相似流式数据同样持续写入目的数据存储。
为了及时处理流数据,就须要一个低延迟、可扩展、高可靠的处理引擎。对于一个流计算系统来讲,它应达到以下需求:
高性能:处理大数据的基本要求,如每秒处理几十万条数据。
海量式:支持TB级甚至是PB级的数据规模。
实时性:保证较低的延迟时间,达到秒级别,甚至是毫秒级别。
分布式:支持大数据的基本架构,必须可以平滑扩展。
易用性:可以快速进行开发和部署。
可靠性:能可靠地处理流数据。
目前有三类常见的流计算框架和平台:商业级的流计算平台、开源流计算框架、公司为支持自身业务开发的流计算框架。
(1)商业级: InfoSphere Streams(IBM)和StreamBase(IBM)。
(2)开源流计算框架,表明以下:Storm(Twitter)、 S4(Yahoo)。
(3)公司为支持自身业务开发的流计算框架:Puma(Facebook)、Dstream(百度)、银河流数据处理平台(淘宝)。
Storm是Twitter开源的分布式实时大数据处理框架,随着流计算的应用日趋普遍, Storm的知名度和做用日益提升。接下来介绍Storm的核心组件以及性能对比。
Storm的核心组件
Nimbus:即Storm的Master,负责资源分配和任务调度。一个Storm集群只有一个Nimbus。
Supervisor:即Storm的Slave,负责接收Nimbus分配的任务,管理全部Worker,一个Supervisor节点中包含多个Worker进程。
Worker:工做进程,每一个工做进程中都有多个Task。
Task:任务,在 Storm 集群中每一个 Spout 和 Bolt 都由若干个任务(tasks)来执行。每一个任务都与一个执行线程相对应。
Topology:计算拓扑,Storm 的拓扑是对实时计算应用逻辑的封装,它的做用与 MapReduce 的任务(Job)很类似,区别在于 MapReduce 的一个 Job 在获得结果以后总会结束,而拓扑会一直在集群中运行,直到你手动去终止它。拓扑还能够理解成由一系列经过数据流(Stream Grouping)相互关联的 Spout 和 Bolt 组成的的拓扑结构。
Stream:数据流(Streams)是 Storm 中最核心的抽象概念。一个数据流指的是在分布式环境中并行建立、处理的一组元组(tuple)的无界序列。数据流能够由一种可以表述数据流中元组的域(fields)的模式来定义。
Spout:数据源(Spout)是拓扑中数据流的来源。通常 Spout 会从一个外部的数据源读取元组而后将他们发送到拓扑中。根据需求的不一样,Spout 既能够定义为可靠的数据源,也能够定义为不可靠的数据源。一个可靠的 Spout可以在它发送的元组处理失败时从新发送该元组,以确保全部的元组都能获得正确的处理;相对应的,不可靠的 Spout 就不会在元组发送以后对元组进行任何其余的处理。一个 Spout能够发送多个数据流。
Bolt:拓扑中全部的数据处理均是由 Bolt 完成的。经过数据过滤(filtering)、函数处理(functions)、聚合(aggregations)、联结(joins)、数据库交互等功能,Bolt 几乎可以完成任何一种数据处理需求。一个 Bolt 能够实现简单的数据流转换,而更复杂的数据流变换一般须要使用多个 Bolt 并经过多个步骤完成。
Stream grouping:为拓扑中的每一个 Bolt 的肯定输入数据流是定义一个拓扑的重要环节。数据流分组定义了在 Bolt 的不一样任务(tasks)中划分数据流的方式。在 Storm 中有八种内置的数据流分组方式。
Reliability:可靠性。Storm 能够经过拓扑来确保每一个发送的元组都能获得正确处理。经过跟踪由 Spout 发出的每一个元组构成的元组树能够肯定元组是否已经完成处理。每一个拓扑都有一个“消息延时”参数,若是 Storm 在延时时间内没有检测到元组是否处理完成,就会将该元组标记为处理失败,并会在稍后从新发送该元组。
(图1:Storm核心组件)
(图2:Storm编程模型)
主流计算引擎的对比
目前比较流行的实时处理引擎有 Storm,Spark Streaming,Flink。每一个引擎都有各自的特色和应用场景。 下表是对这三个引擎的简单对比。
(图3:主流引擎性能对比)
总结:流计算的出现拓宽了咱们应对复杂实时计算需求能力。Storm做为流计算的利器,极大方便了咱们的应用。流计算引擎还在不断发展,基于Storm和Flink开发的JStorm,Blink等计算引擎在性能各方面都有极大的提升。流计算值得咱们继续关注。
【1】http://storm.apache.org/releases/current/Concepts.html
【2】https://en.wikipedia.org/wiki/Storm_(event_processor)
【3】https://toutiao.io/posts/88a6nt
【4】https://blog.csdn.net/fjse51/article/details/53886516
【5】http://www.javashuo.com/article/p-sibmjyds-bc.html
【6】https://www.douban.com/note/642346037/
【7】https://www.cnblogs.com/ostin/articles/7256003.html
【8】https://tech.meituan.com/real_timedata_measure.html
【9】http://www.cnblogs.com/jiyukai/p/9471944.html
做者:姚远
来源:宜信技术学院