Spark Streaming运行原理
首先我们看一下Spark Streaming的运行流程,和之前Spark Core一样都是先创建Context,这里创建的是StreamingContext。Spark Streaming的启动和Spark Core不一样,它是调用StreamingContext.start()方法来启动,但是触发执行RDD算子也是一样的需要action操作,下面就先看一下整个运行流程:
上就是Spark Streaming的运行流程,首先创建StreamingContext,在初始化的时候会先创建两个重要的组件DStreamGraph和JobScheduler,而在start()方法中创建了其他两个重要组件JobGenerator和ReceiverTracker,下面具体分析一下每个组件在整个工作流程中的作用。
这里先说一下DStreamGraph的功能,它和DAGScheduler的功能类似,它负责记录每个DStream直接的状态关系(依赖关系);
在start()方法调用之后,Driver节点开始去Spark集群上的某个Executor上启动输入DStream(JavaReceiverDStream)的Receiver;
接着worker节点的Executor上的Receiver接收到数据之后,就会先将数据保存到Executor对应的BlockManager中,接着会发送一份数据信息到StreamingContext的ReceiverTracker中;
接着JobGenerator会就根据我们定义的batch间隔去ReceiverTracker中获取一次时间间隔内的数据,将其封装为一个RDD(batch interval时间间隔的数据对应一个RDD)。它就会根据DStreamGraph定义的算子和各个DStream之间的依赖关系,去生成一个Job,Job的初始RDD就是刚才创建的batch对应的 RDD,然后提交给JobScheduler;
JobScheduler的任务就是负责提交Job,Job的提交流程就和之前Spark Core里面的提交流程是一样的。
上面就是Spark Streaming的基本运行流程,我们从Spark Streaming层面分析了各个组件在整个运行过程中的作用,其实底层依然是基于Spark Core Engine来运行的。