Spark Streaming属于流处理系统,它提供的处理引擎和RDD编程模型可以同时进行批处理与流处理。本章介绍了Spark Streaming实时数据流的数据处理。
- 很多企业为了支持决策分析而构建的数据仓库系统,其中存放的大量历史数据就是静态数据。技术人员可以利用数据挖掘和OLAP(On-Line Analytical Processing)分析工具从静态数据中找到对企业有价值的信息
- 近年来,在Web应用、网络监控、传感监测等领域,兴起了一种新的数据密集型应用——流数据,即数据以大量、快速、时变的流形式持续到达
- 数据快速持续到达,潜在大小也许是无穷无尽的
- 数据来源众多,格式复杂
- 数据量大,但是不十分关注存储,一旦经过处理,要么被丢弃,要么被归档存储
- 注重数据的整体价值,不过分关注个别数据
- 数据顺序颠倒,或者不完整,系统无法控制将要处理的新到达的数据元素的顺序
- 对静态数据和流数据的处理,对应着两种截然不同的计算模式:批量计算和实时计算
- 批量计算:充裕时间处理静态数据,如Hadoop
- 流数据不适合采用批量计算
- 流数据必须采用实时计算,响应时间为秒级
- 数据量少时,不是问题,但是,在大数据时代,数据格式复杂、来源众多、数据量巨大,对实时计算提出了很大的挑战。因此,针对流数据的实时计算——流计算,应运而生
流计算:实时获取来自不同数据源的海量数据,经过实时分析处理,获得有价值的信息 流计算秉承一个基本理念,即数据的价值随着时间的流逝而降低,如用户点击流。因此,当事件出现时就应该立即进行处理,而不是缓存起来进行批量处理。为了及时处理流数据,就需要一个低延迟、可扩展、高可靠的处理引擎 对于一个流计算系统来说,它应达到如下需求:
- 高性能:处理大数据的基本要求,如每秒处理几十万条数据
- 海量式:支持TB级甚至是PB级的数据规模
- 实时性:保证较低的延迟时间,达到秒级别,甚至是毫秒级别
- 分布式:支持大数据的基本架构,必须能够平滑扩展
- 易用性:能够快速进行开发和部署
- 可靠性:能可靠地处理流数据
传统的数据处理流程,需要先采集数据并存储在关系数据库等数据管理系统中,之后由用户通过查询操作和数据管理系统进行交互 传统的数据处理流程隐含了两个前提:
- 存储的数据是旧的。存储的静态数据是过去某一时刻的快照,这些数据在查询时可能已不具备时效性了
- 需要用户主动发出查询来获取结果 流计算的处理流程一般包含三个阶段:
- 数据实时采集
- 数据实时采集阶段通常采集多个数据源的海量数据,需要保证实时性、低延迟与稳定可靠
- 以日志数据为例,由于分布式集群的广泛应用,数据分散存储在不同的机器上,因此需要实时汇总来自不同机器上的日志数据
- 数据实时计算
- 数据实时计算阶段对采集的数据进行实时的分析和计算,并反馈实时结果
- 经流处理系统处理后的数据,可视情况进行存储,以便之后再进行分析计算。在时效性要求较高的场景中,处理之后的数据也可以直接丢弃
- 实时查询服务
- 时查询服务:经由流计算框架得出的结果可供用户进行实时查询、展示或储存
- 传统的数据处理流程,用户需要主动发出查询才能获得想要的结果。而在流处理流程中,实时查询服务可以不断更新结果,并将用户所需的结果实时推送给用户
- 虽然通过对传统的数据处理系统进行定时查询,也可以实现不断地更新结果和结果推送,但通过这样的方式获取的结果,仍然是根据过去某一时刻的数据得到的结果,与实时结果有着本质的区别
- 流处理系统处理的是实时的数据,而传统的数据处理系统处理的是预先存储好的静态数据
- 用户通过流处理系统获取的是实时结果,而通过传统的数据处理系统,获取的是过去某一时刻的结果
- 流处理系统无需用户主动发出查询,实时查询服务可以主动将实时结果推送给用户
- Spark Streaming是一个构建在Spark之上,是Spark四大组件之一
- 是Spark系统中用于处理流式数据的分布式流式处理框架
- 具有可伸缩、高吞吐量、容错能力强等特点。
- 能够和Spark SQL、MLlib、GraphX无缝集成
- 处理的数据源可以来自Kafka,Flume,Twitter,ZeroMQ,HDFS, TCP sockets
- 不仅可以通过调用map,reduce,join和window等API函数来处理数据,也可以使用机器学习、图算法来处理数据
- 最终结果可以保存在文件系统、数据库或者实时Dashboard展示 Spark Streaming的输入数据按照时间片(batch size)分成一段一段的数据,得到批数据(batch data),每一段数据都转换成Spark中的RDD,然后将Spark Streaming中对DStream的Transformation操作变为针对Spark中的RDD的Transformation操作,将RDD经过操作变成中间结果保存在内存中。整个流式计算根据业务的需求可以对中间的结果进行叠加或者存储到外部设备。
- 批处理间隔
- 在Spark Streaming中,数据采集是逐条进行的,而数据的处理是按批进行的,因此在Spark Streaming中会先设置好批处理间隔(batch interval)。当超出批处理间隔时就会把采集到的数据汇集起来成为一批数据交给系统处理。
- StreamingContext对象
- 在RDD编程中需要生成一个SparkContext对象,在Spark SQL中需要生成一个SQLContext对象,同理,如果要运行一个Spark Streaming程序,就需要生成一个StreamingContext对象,它是Spark Streaming程序的主入口。
- 可以用以下代码创建StreamingContext对象。StreamingContext(sc,Seconds(1))的两个参数中,sc表示SparkContext对象,Seconds(1)表示在对Spark Streaming的数据流进行分段时,每一秒切成一个分段,但是该系统无法实现毫秒级别的分段,因此,Spark Streaming无法实现毫秒级别的流计算。
- 如果是编写一个独立的Spark Streaming程序,则需要在代码文件中用以下代码创建StreamingContext对象。
创建StreamingContext对象
创建InputDStream: Spark Streaming需要指明数据源,DStream输入源包括基础来源和高级来源,基础来源是在StreamingContext API中直接可用的来源,如文件系统、Socket连接。高级来源包括Kafka、Flume、Kinesis、Twitter等,高级来源可以通过额外的实用工具类创建
操作DStream:对于从数据源得到的DStream,用户可以在其基础上进行各种操作
启动Spark Streaming:之前的所有步骤只是创建了执行流程,程序没有真正连接上数据源,也没有对数据进行任何操作,只是设定好了所有的执行计划,当streamingContext.start()启动后程序才真正进行所有预期的操作
等待结束:通过streamingContext.awaitTermination()方法来等待处理结束(手动结束或因为错误而结束)
手动结束:可以通过streamingContext.stop()来手动结束流计算进程