SparkStreaming-运行架构
SparkStreaming相对其他流处理系统最大的优势在于流处理引擎和数据处理在同一个软件栈,其中SparkStreaming功能主要包括流处理引擎的流数据接收与存储以及批处理作业的生成与管理,而spark核心负责处理SparkStreaming发送过来的作业。SparkStreaming分为Driver端和Client端。
运行在Driver端为StreamingContext实例。StreamingContext实例包括DSteamGraph和JobScheduler(包括ReceiverTracker和JobGenerator)等
运行在Client端为ReciverSupervisor和Reciver等。
SparkStreaming进行流数据处理大致可以分为:
1.启动流处理引擎
2.接收及存储流数据
3.处理流数据
4.输出处理结果
如下图所示:
详解:
(1).初始化StreamingContext对象,在该对象启动过程中实例化DStreamGraph和JobScheduler
DStreamGraph用于存放DStream以及DStream之间的依赖关系等信息。
JobScheduler中包括ReceiverTracker和JobGenerator。ReceiverTracker为Driver端流数据接收器(Receiver)的管理者;JobGenerator为批处理作业生成器。
在ReceiverTracker启动过程中,根据流数据接收器分发策略通知对应的Executor中的流数据接收管理器(ReciverSupervisor)启动,再由ReciverSupervisor启动流数据接收器。
(2).当流数据接收器Receiver启动后,持续不断地接收实时流数据,根据传过来数据的大小进行判断,如果数据量很小,则攒多条数据成一块,然后再进行块存储;如果数据量大,则直接进行块存储。
对于这些数据Receiver直接交到ReciverSupervisor,由其进行数据转储操作。块存储根据设置是否预写日志分为两种:
一种是使用非预写日志BlockManagerBasedBlockHandler方法直接写到Worker的内存或磁盘中
另一种是进行预写日志WriteAheadLogBasedBlockHandler方法,即在预写日志同时把数据写入到Worker的内存或磁盘中
数据存储完毕后,ReciverSupervisor会把数据存储的云信息上报给ReceiverTracker,ReceiverTracker再把这些信息转发给ReceivedBlockTracker,由它负责管理收到数据块的元信息。
(3).在StreamingContext的JobGenerator中维护一个定时器,该定时器在批处理时间到来时会进行生成作业的操作。在该操作中会进行如下操作:
a.通知ReceiverTracker将接收到的数据进行提交,在提交时采用synchronized关键字进行处理,保证每条数据被划入一个且只被划入一个批次中。
b.要求DStreamGraph根据DStream依赖关系生成作业序列Seq[Job]
c.从第一步中ReceiverTracker获取本批次数据的元数据。
d.把批处理时间time、作业序列Seq[Job]和本批次数据的元数据包装为JobSet,调用JobScheduler.submitJobSet(JobSet)提交给JobScheduler,JobScheduler将把这些作业发送给Spark核心进行处理,由于该执行为异步,因此本步执行速度将非常快。
e.只要提交结束(不管作业是否被执行),SparkStreaming对整个系统做一个检查点(checkpoint)
(4).Spark核心的作业对数据进行处理,处理完毕后输出到外部系统,如数据库或文件系统,输出的数据可以被外部系统所使用。
由于实时留数据的数据源源不断地流入,Spark会周而复始地进行数据处理,响应也会持续不断地输出结果。