Spark Streaming运行架构

1、Spark Streaming总体运行架构

    SparkStreaming分为Driver端和Client端,运行在Driver端的是StreamingContext实例。对于StreamingContext进行实例化的时候主要涉及到DStreamGraph和JobSchedule(包含ReceiverTracker和JobGenerator),而Client端主要完成对ReceiverSupervisor和Receiver相关的初始化。整个SparkStreaming模块的代码如下,由代码模块的构成基本可以看出SparkStreaming运行时的一些信息:

    SparkStreaming进行流数据处理的大致流程可分为:启动流处理引擎、接受和存储流数据、处理流数据和输出处理结果等四个步骤,其运行的架构图如下[1]:

Spark Streaming运行架构

2、Spark Streaming初始化过程与流数据处理流程

一、启动流引擎时,需要先初始化StreamingContext,在调用StreamingContext实例的start方法后,在该对象启动过程中实例化DStreamGraph和JobScheduler,其中DStreamGraph用于存放DStream之间的依赖关系。DStreamGraph的初始化代码如下:

而JobScheduler主要由ReceiverTracker和JobGenerator。其中ReceiverTracker为Driver端流数据接收器Receiver的管理器,JobGenerator为批处理作业生产器。在ReceiverTracker的启动过程中,根据流数据接收器分发策略通知对应的Executor中的流数据接收器管理器ReceiverSupervisor启动,再由ReceiverSupervisor启动流数据的接收器。

二、流数据接收与存储。当流数据接收器Receiver启动后,会持续不断地接收实时流数据,流数据的存储会根据数据量畨大小进行判断。如果数据量很小,会攒成多条数据成一块,然后进行块存储,如果数据量大,则进行直接存储,这些数据由Receiver直接交给ReceiverSupervisor,由其进行数据转换存储操作。ReceivedBlockHandler接口对于块存储的存储根据是否设置预写日志分成两种的形式。第一种对于没有设置预写日志的写入形式,采用BlockManagerBasedBlockHandler方法直接写入Spark Worker中的内存或者磁盘中,对应的源代码如下:

第二种是设置了预写日志的写入形式,即调用WriteAheadLogBasedBlockHander方法,即在预写日志的同时将数据写入Worker的内存或者磁盘当中,对应的源代码如下:



数据存储完毕后,ReceiverSupervisor会把数据存储的元信息上报给ReceiverTracker,ReceiverTracker再把这些信息准发给ReceiverBlockTracker,由它负责管理接收数据的元信息。

三、流数据得处理。StreamingContext当中的JobGenerator中维护着一个定时器,该定时器在批处理时间到来时会生成作业的操作,主要进行以下操作:

1、通知ReceiverTracker将接受到的数据进行提交,提交的时候采用synchronized关键字进行处理,保证每条数据被划入一个且只能被划入一个批中。

2、要求DStreamGraph根据DStream的依赖关系生产作业序列Seq[Job]

3、从第一步中ReceiverTracker获取本批次数据的元数据

4、把批处理时间time、作业序列Seq[Job]和本批次数据的元数据包装为JobSet,调用JobScheduler.submitJobSet(JobSet)提交给JobScheduler,JobScheduler将把作业发送给Spark核心进行处理,由于该执行行为为异步,所以执行速度很快。

5、只要提交结束(不管作业是否被执行),Spark Streaming对整个系统做一次检查点(CheckPoint)。

四、流数据的输出操作。在Spark核心的作业对数据进行处理完毕后输出到外部系统,如数据库或者文件系统。

以上就是整个Spark Streaming的整个运行过程,对于具体的运行过程细节,在后面的文章中会进行描述。

参考内容

1、《图解Spark核心技术与案例实战》

你可能感兴趣的:(Spark Streaming运行架构)