Spark Streaming运行架构以及代码详解

3 篇文章 0 订阅
1 篇文章 0 订阅

1. 运行架构
spark Streaming相对其他流处理系统最大的优势在于流处理引擎和数据处理在同一软件栈,其中Spark Streaming功能主要包括流处理引擎的流数据接收与存储以及批处理作业的生成与管理,而Spark Core负责处理Spark Streaming发送过来的作业。Spark Streaming分为Driver端和Client端,运行在Driver端为StreamingContext实例,该实例包括DStreamGraph和JobScheduler(包括ReceiverTracker和JobGenerator)等,而Client包括ReceiverSupervisor和Receiver等。
Spark Streaming进行流数据处理大致可以分为:启动流数据引擎、接收及存储流数据、处理流数据和输出处理结果等4个步骤。
在这里插入图片描述

2. Spark Streaming各个组件
1.StreamingContext: Spark Streaming 中Driver端的上下文对象,初始化的时候会构造Spark Streaming应用程序需要使用的组件,比如DStreamGraph,JobScheduler等。
2.DStreamGraph:用于保存DStream和DStream之间依赖关系等信息。
3.JobScheduler: 主要用于调度job。JobScheduler主要通过JobGenerator产生job,并且通过ReceiverTracker管理流数据接收器Receiver。
4.JobGenerator: 主要是从DStream产生job, 且根据指定时间执行checkpoint. 他维护了一个定时器,该定时器在批处理时间到来的时候会进行生成作业的操作。
5.ReceiverTracker: 管理各个Executor上的Receiver的元数据。它在启动的时候,需要根据流数据接收器Receiver分发策略通知对应的Executor中的ReceiverSupervisor(接收器管理着)启动,然后再由ReceiverSupervisor来启动对应节点的Receiver
6.ReceiverTrackerEndpoint: ReceiverTracker用于通信的RPC终端。
7.Receiver:数据接收器,用于接收数据,通过ReceiverSupervisor将数据交给ReceiveBlockHandler来处理。
8.ReceiverSupervisor:主要用于管理各个worker节点上的Receivor,比如启动worker上的Receiver,或者是转存数据,交给ReceiveBlockHandler来处理;数据转存完毕,将数据存储的元信息汇报给ReceiverTracker,由它来负责管理收到的数据块元信息。
9.BlockGenerator: 这个类的主要作用是创建Receiver接收的数据的batches,然后根据时间间隔命名为合适的block. 并且把准备就绪的batches作为block 推送到BlockManager。
10.ReceiveBlockHandler:主要根据是否启用WAL预写日志的机制,区分为预写日志和非预写日志存储。非预写日志则是直接将数据通过BlockManager写入Worker的内存或者磁盘;而预写日志则是在预写日志的同时把数据写入Worker的内存或者磁盘。
11.ReceiverSchedulingPolicy: Receiver调度策略

3. 运行原理剖析

  1. 1、初始化StreamingContext对象,在该对象启动过程中实例化DStreamGraph 和 JobScheduler,其中DStreamGraph用于存放DStream以及DStram之间的依赖关系等信息;而JobScheduler中包括ReceiverTracker和JobSGenerator,其中ReceiverTracker为Driver端流数据接收器(Receiver)的管理者,JobGenerator为批处理作业生成器。在ReceiverTracker启动过程中,根据流数据接收器分发策略通知对应的Executor中的流数据接收管理器(ReceiverSupervisor)启动,再由ReceiverSupervisor启动流数据接收器。
  2. 2、当流数据接收器Receiver启动后,持续不断地接收实时流数据,根据传过来数据的大小进行判断,如果数据量很小,则攒多条数据成一块,然后再进行块存储;如果数据量大,则直接进行块存储。对于这些数据Receiver直接交给ReceiverSupervisor,由其进行数据转储操作。块存储根据设置是否预写日志分为两种,一种是使用非预写日志BlockManagerBasedBlockHandler方法直接写到Worker的内存或磁盘中;另一种是进行预写日WriteAheadLogBasedBlockHandler方法,即在预写日志同时把数据写入到Worker的内存或磁盘中。数据存储完毕后,ReceiverSupervisor会把数据存储的元信息上报给ReceiverTracker,ReceiverTracker再把这些信息转发给ReceiverBlockTracker,由它负责管理收到数据块的元信息。
  3. 3、在StreamingContext的JobGenerator中维护一个定时器,该定时器在批处理时间到来会进行生成作业的操作,具体如下:
    1.通知ReceiverTracker将接收到的数据进行提交,在提交时采用synchronized关键字进行处理,保证每条数据被划入一个且只被划入一个批中。
    2.要求DStreamGraph根据DStream依赖关系生成作业序列Seq[Job]。
    3.从第一步中ReceiverTracker获取本批次数据的元数据。
    4.把批处理时间time、作业序列Seq[Job]和本批次数据的元数据包装为JobSet,调用JobScheduler.submitJobSet(JobSet)提交给JobScheduler,JobScheduler将把这些作业发送给Spark Core进行处理,由于该操作是异步的,因为本操作执行速度非常快。
    5.只要提交结束(不管作业是否被执行),Spark Streaming对整个系统做一个检查点(Checkpoint)。
    4. 运行原理源码分析
    4.1. 启动流处理引擎
    在这里插入图片描述
    4.1.1. 初始化StreamingContext
    首先需要初始化StreamingContext,在初始化的过程中会对DStreamGraph、JobScheduler等进行初始化,DStreamGraph类似于RDD的有向无环图,包含DStream之间相互依赖的有向无环图;JobScheduler的作用是定时查看DStreamGraph,然后根据流入的数据生成运行作业。
    4.1.2. 创建InputDStream
    根据你采用不同的数据源,可能生成的输入数据流不一样。
    4.1.3. 启动JobScheduler
    创建完成InputDStream之后,调用StreamingContext的start方法启动应用程序,其最重要的就是启动JobScheduler。在启动JobScheduler的时候会实例化ReceiverTracker和JobGenerator。
    在这里插入图片描述
    4.1.4. 启动JobGenerator
    启动JobGenerator需要判断是否第一次运行,如果不是第一次运行需要进行上次检查点的恢复,如果是第一次运行则调用startFirstTime方法,在该方法中初始化了定时器的开启时间,并启动了DStreamGraph和定时器timer。
    在这里插入图片描述
    timer的getStartTime方法会计算出来下一个周期到期时间,计算公式: 当前时间 / 间隔时间。
    4.2. 接收及存储流数据
    4.2.1. 启动ReceiverTracker
    启动ReceiverTracker的时候,如果输入数据流不为空,则调用launchReceivers方法,然后他就会向ReceiverTrackerEndpoint发送StartAllReceivers方法,启动所有Receivers。
    在这里插入图片描述
    最后创建ReceiverSupervisor,并启动,在启动的时候,由它启动Receiver。
    4.2.2. Receiver启动并接收数据
    Receiver启动会调用各个具体子类的onstart方法,这里面就会接收数据,以kafka为例,则会根据提供配置创建连接,获取消息流,构造一个线程池,为每一个topic分区分配一个线程处理数据。
    在这里插入图片描述
    4.2.3. 启动BlockGenerator生成block
    在ReceiverSupervisorImpl的onstart方法中调用BlockGenerator的start启动BlockGenerator。
    在这里插入图片描述
    启动时候会先更新自身状态为Active,然后启动2个线程:
    blockIntervalTimer:定义开始一个新batch,然后准备把之前的batch作为一个block。
    blockPushingThread:把数据块 push到block manager。
    在这里插入图片描述
    4.2.4. 数据存储
    Receiver会进行数据的存储,如果数据量很少,则攒多条数据成数据块在进行块存储;如果数据量很大,则直接进行存储,对于需要攒多条数据成数据块的操作在Receiver.store方法里面调用ReceiverSupervisor的pushSingle方法处理。在pushSingle中把数据先保存在内存中,这些内存数据被BlockGenerator的定时器线程blockIntervalTimer加入队列并调用ReceiverSupervisor的pushArrayBuffer方法进行处理。
    他们其实都是调用的是pushAndReportBlock,该方法会调用ReceiveBlockHandler的storeBlock方法保存数据并根据配置进行预写日志;另外存储数据块并向driver报告:
    在这里插入图片描述
    4.3. 数据处理
    我们知道DStream在进行action操作时,会触发job。我们以saveAsTextFiles方法为例:
    在这里插入图片描述
    foreachRDD:它会向DStreamGraph注册,根据返回的当前的DStream然后创建ForEachDStream
    在这里插入图片描述
    register: 向DStreamGraph注册,即向DStreamGraph添加输出流
    在这里插入图片描述
    JobGenerator初始化的时候会构造一个timer定时器:
    在这里插入图片描述
    它会启动一个后台线程,不断去调用triggerActionForNextInterval方法,该方法就会不断调用processsEvent方法,并且传递GenerateJobs事件
    在这里插入图片描述
    JobGenerator# generateJobs

调用DStreamGraph的generateJobs方法产生job,然后利用JobScheduler开始提交job集合
在这里插入图片描述
DStreamGraph的generateJobs根据时间产生job集
在这里插入图片描述
然后调用DStream的generateJobs产生job
在这里插入图片描述
最后提交job集合
提交job集合,遍历每一个job,创建JobHandler,然后JobHandler是一个线程类,在其run方法中会向JobScheduler发送JobStarted事件,从而开始处理job。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark Streaming是基于Spark核心引擎的流处理框架,它将实时数据流分成小批次进行处理,每个批次都可以像RDD一样进行处理。Spark Streaming架构原理主要包括以下几个方面: 1. 数据源:Spark Streaming支持多种数据源,包括Kafka、Flume、Twitter、HDFS等,用户可以根据自己的需求选择合适的数据源。 2. 数据接收器:Spark Streaming通过数据接收器从数据源中获取数据,并将数据分成小批次进行处理。数据接收器可以是Spark自带的接收器,也可以是自定义的接收器。 3. 数据处理:Spark Streaming将每个批次的数据转换成RDD,然后通过Spark的转换操作进行处理。用户可以使用Spark提供的各种转换操作,如map、filter、reduce等。 4. 数据输出:Spark Streaming支持多种数据输出方式,包括HDFS、数据库、Kafka等。用户可以根据自己的需求选择合适的输出方式。 5. 容错性:Spark Streaming具有高度的容错性,它可以在节点故障或数据丢失的情况下自动恢复,并保证数据处理的准确性和完整性。 总之,Spark Streaming架构原理是基于Spark核心引擎的流处理框架,它通过数据源、数据接收器、数据处理和数据输出等组件实现实时数据流的处理和分析。 ### 回答2: Spark StreamingSpark的一种实时数据处理框架,它可以在Spark的强大计算引擎上,实现对实时数据流的高效处理和分析。Spark Streaming架构原理包括以下几个部分: 1. 数据输入层:Spark Streaming的数据输入来源可以是各种数据源,例如Kafka、Flume、HDFS、socket等。在Spark Streaming中,输入的数据流被称为DStream(Discretized Stream),它是一系列连续的RDD(Resilient Distributed Datasets)。 2. 数据处理层:DStream作为Spark Streaming的基本数据结构,可以使用Spark强大的RDD操作函数进行处理。例如map、reduce、join等。Spark Streaming支持的RDD操作函数都可以被应用到DStream上,因此可以实现强大和灵活的数据处理和分析。 3. 数据输出层:在数据处理完成后,Spark Streaming提供了多种数据输出方式,例如将数据存储在HDFS、将数据发送到Kafka或Flume等消息系统、将数据推送到Web UI或Dashboards等。用户可以根据自己的需求选择合适的输出方式。 4. 容错性和可伸缩性:Spark Streaming具有良好的容错性和可伸缩性,它可以在集群中进行分布式计算和分布式存储,并保证数据计算和处理的完整性。 总的来说,Spark Streaming架构原理基于Spark强大的计算和分布式处理引擎,实现了对实时数据流的高效处理和分析。以应对大数据时代对实时业务处理和分析的需求。 ### 回答3: Spark Streaming架构原理是基于Spark的批处理引擎和Spark执行引擎基础上,实现了流式处理。其原理是将连续不断的数据流按照一定的时间间隔划分成批处理的数据流,将批数据流转化为RDD,再通过Spark执行引擎进行处理计算。 Spark Streaming架构包含以下组件: 1.数据输入源:包括数据输入流的来源,如Kafka、Flume、HDFS、Socket等。 2.输入DStream:对输入数据流进行封装,存储在内存中,以RDD形式进行处理。 3.数据处理引擎:处理包括数据转换、过滤、聚合等操作,使用Spark的高度并行化和内存计算能力。 4.处理结果输出:将处理结果输出到外部存储系统,如HDFS、数据库等。 在Spark Streaming的具体实现过程中,有以下三个重要的概念: 1.数据流窗口:指的是对输入的数据按照一定的时间间隔进行划分,把一段时间内的数据封装成一个小的包进行处理。可以设置窗口的大小和滑动间隔。 2.离散化流:将输入的数据流通过DStream划分成一系列的离散化的RDD,每个RDD包含窗口中一段时间内的数据。 3.转换操作:对离散化流中每个RDD进行转换操作,包括map、filter、reduce、join等操作,完成对数据流的处理。 在使用Spark Streaming架构进行数据流处理的时候,需要注意以下几点: 1.数据处理设计应该具备时效性和高可用性,尽可能减少延迟时间。 2.需要合理设置RDD缓存机制,避免数据丢失。 3.考虑到复杂的计算可能会使内存存储溢出,需要合理设置批处理的大小。 总的来说,Spark Streaming架构是一种基于Spark的流式数据处理框架。其实现原理是通过将流式数据划分为小的批处理进行离散化和转换,再结合Spark的高并发执行引擎实现对数据流的高速、时效性处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值