前言
经过了前5篇文章的介绍 ,本专栏的内容已经近半了。本文接下来主要介绍Spark中的流计算,以及编程的基本方法。在正式开始介绍流计算前,首先要理解几种不同的数据类型。然后给出流计算的基本框架以及其处理的基本流程。
全部的Spark Streaming内容分为两篇,本文介绍其基本概念以及基本操作。下一篇主要是介绍如何设置输入源,且对其数据抽象DStream进行转换与输出操作。
本文的主要内容包括以下几个部分:
前言
流式计算概述
Spark Streaming解析
Spark Streaming部署
DStream基础操作
总结
Part1.流计算概述
在企业中,有两种典型的数据形式。分别为:
- 静态数据。比如数据仓库,就是一种典型的静态数据。开发人员从生产环境通过ETL工具周期性的将数据转存到数据仓库中。然后对历史数据进行查询分析等操作。
- 流式数据。数据以大量、快速、时变地持续到达。比如电商中的用户点击流数据就是一种流式数据。
⭐️流式数据的特征:
- 快速持续到达。潜在大小无穷无尽;
- 数据源多,格式复杂。数据量大;
- 一旦经过处理,可能被丢弃,也可能被归档储存;
- 注重数据的整体价值,不贵哦分关注个别数据;
- 数据顺序颠倒,或者不完整,系统无法控制将要处理 的新到达的数据元素的顺序。
由于静态数据和流式数据的显著不同,企业通常使用两种不同的手段对这两种数据进行处理。
- 批量计算。主要针对静态数据。对时效要求较低,如Hadoop。存储的数据是旧的,因此不具备时效性(如t+1)。需要用户主动发出查询来获取结果。可以直接通过运算产出价值。
- 实时计算。主要针对动态数据。主动将结果推给用户。对响应速度要求也很高(秒或毫秒级)。采集多种数据源,如分布式日志采集系统 数百兆/s(Flume/Chukwa /Time Tunnel)。挑选有价值的部分,其余丢弃。时效性要求高的场景通常会直接将数据丢弃。
流式计算要实时获取来自不同数据源的海量数据,经过实时分析出路,获取有价值的信息。一般要经三个步骤:数据实时采集->实时分析处理->结果反馈。且整个过程对响应速度的要求非常高。用户的查询语句都是实时的查询服务,可以得到最新的查询结果,而不是t+1的历史数据。
流计算秉承一个基本理念,即数据的价值随着时间的流逝而降低 。如用户点击流。因此,当事件出现时就应该立即 进行处理,而不是缓存起来进行批量处理。为了及时处理 流数据,就需要一个低延迟、可扩展、高可靠的处理引擎。
⭐️对于一个流计算系统来说,它应达到如下需求:
- 高性能:处理大数据的基本要求,如每秒处理几十万条数据 ;
- 海量式:支持TB级甚至是PB级的数据规模;
- 实时性:保证较低的延迟时间,达到秒级别,甚至是毫秒级别;
- 分布式:支持大数据的基本架构,必须能够平滑扩展(数据规模扩大时 可以直接通过引入更多机器进行性能扩展);
- 易用性:能够快速进行开发和部署;
- 可靠性:能可靠地处理流数据。
Part2.Spark Streaming解析
接下来介绍一下这个非常优秀的流计算框架——Spark Streaming的基本原理,并在下一部分中,和当下流行的Storm做一个对比。
Spark Streaming可整合多种输入数据源,如Kafka、 Flume、HDFS,甚至是普通的TCP套接字。经处理后的 数据可存储至文件系统、数据库,或显示在仪表盘里。
Spark Streaming支持的输入、输出数据源
Spark Streaming并不是真正意义上的流计算 。其基本原理是将实时输入数据流以时间片(最小单位为秒)为单位进行拆分,然后经Spark引擎以微小批处理的方式处理每个时间片数据。
Spark Streaming执行流程
Spark Streaming最主要的抽象是DStream(Discretized Stream,离散化数据流),表示连续不断的数据流。在内部实现上,Spark Streaming的输入数据按照时间片(如1秒)分成一段一段,每一段数据转换为Spark中的RDD,这些分段就是Dstream,并且对DStream的操作都最终转变为对相应的RDD的操作 。因此,Spark Streaming是建立在SparkCore之上的。其逻辑本质很简单,就是一系列的RDD。
DStream操作示意图
⭐️前面提到的每一种Spark工作方式都有一种数据抽象,回顾一下:
- Spark Core:数据抽象为 RDD;
- Spark SQL:数据抽象为 DataFrame;
- Spark Streaming:数据抽象为 DStream。
Part3.Spark Streaming的部署
企业中的大数据处理平台,因为Spark出现而发生转变。从―Hadoop+Storm‖架构转向Spark架构。
⭐️Spark Streaming与Storm的对比:
- Spark Streaming和Storm最大的区别在于,Spark Streaming无法实现毫秒级的流计算,而Storm可以实现毫秒级响应;
- Spark Streaming构建在Spark上,一方面是因为Spark的低延迟执行引擎(100ms+)可以用于实时计算,另一方面,相比于Storm,RDD数据集更容易做高效的容错处理;
- Spark Streaming可以同时兼容批量和实时数据处理的逻辑和算法。因此,方便了一些需要历史数据和实时数据联合分析的特定应用场合。
采用Hadoop+Storm部署
⭐️采用Spark架构的优点:
- 可以实现一键式安装和配置、线程级别的任务监控和告警。
- 并且降低硬件集群构建、软件维护、 任务监控和应用开发的难度;
- 而且便于做成统一的硬件、计算平台资源池。
用Spark架构满足批处理和流处理需求
Part4.DStream基础操作
首先回顾一下Spark集群的运行逻辑:
⭐️Spark Streaming的流程类似,区别是:
- 在Spark Streaming中,会有一个组件Receiver,作为一个长期运行的task跑在一个Executor上。有数据过来就会响应,以此保证流计算的可行性;
- 每个Receiver都会负责一个input DStream(比如从文件中读取数据的文件流,比如套接字流,或者从Kafka中读取的一个输入流等等);
- Spark Streaming通过input DStream与外部数据源进行连接,读取相关数据。
⭐️编写Spark Streaming程序的基本步骤是:
- 通过创建输入DStream来定义输入源;
- 通过对DStream应用转换操作和输出操作来定义流计算;
- 用streamingContext.start()来开始接收数据和处理流程 ;
- 通过streamingContext.awaitTermination()方法来等待处理结束(手动结束或因为错误而结束);
- 可以通过streamingContext.stop()来手动结束流计算进程。
如果要运行一个Spark Streaming程序,就需要首先生成一个 StreamingContext对象 ,它是Spark Streaming程序的主入口。可以从一个SparkConf对象创建一个StreamingContext对象。
在pyspark中的创建方法:进入pyspark以后,就已经获得 了一个默认的SparkConext对象,也就是sc。因此,可以采用如下方式来创建StreamingContext对象。详见代码注释:
>>> from pyspark.streaming import StreamingContext
>>> ssc = StreamingContext(sc, 1)#每隔1秒做一次
如果是编写一个独立的Spark Streaming程序,而不是在 pyspark中运行,则需要通过如下方式创建StreamingContext 对象 ,详见代码注释:
from pyspark import SparkContext, SparkConf
from pyspark.streaming import StreamingContext
conf = SparkConf()
conf.setAppName('TestDStream') #设置数据流应用的名称
conf.setMaster('local[2]') #本地,2个线程
sc = SparkContext(conf = conf) #生成SparkContext主入口
ssc = StreamingContext(sc, 1)
总结
本文简单介绍了Spark Sreaming所处理的数据类型以及其自身的特点。并梳理了其使用小批数据集模拟流式计算的逻辑,最后简单给出了如何生成一个DStream,实现基本的流失计算程序。感谢阅读 。