一 Spark Streaming Job的启动
编写SparkStreaming程序的时候,设置了BatchDuration,Job每隔BatchDuration时间会自动触发,这个功能肯定是SparkStreaming框架提供了一个定时器,时间一到就将编写的程序提交给Spark,并以Spark job的方式运行。
注意:这里的Job不是Spark Core中所指的Job,它只是基于DStreamGraph而生成的RDD的DAG而已,从Java角度讲,相当于Runnable接口实例,此时要想运行Job需要提交给JobScheduler,在JobScheduler中通过线程池的方式找到一个单独的线程来提交Job到集群运行。
注:使用线程池的好处:
a) 作业不断生成,所以为了提升效率,我们需要线程池;这和在Executor中通过线程池执行Task有异曲同工之妙
b) 有可能设置了Job的FAIR公平调度的方式,这个时候也需要多线程的支持
Job启动过程如下所示
说明
2) JobScheduler在启动的时候会实例化EventLoop,并执行EventLoop.start()进行消息循环
3)对Receiver的运行进行管理,ReceiverTracker启动时会调用lanuchReceivers()方法,进而会使用rpc通信启动Receiver(实际代码中,Receiver由 ReceiverSupervisorImpl启动)
4)JobGenerator启动后会不断的根据batchDuration生成一个个的Job
二. Spark Streaming容错机制:
我们知道DStream与RDD的关系就是随着时间流逝DStream不断的产生RDD,对DStream的操作就是在固定时间上操作RDD。Spark Streaming的基于DStream的容错机制,实际上就是划分到每一次形成的RDD的容错机制,这也是Spark Streaming的高明之处。