第3课:通过案例对SparkStreaming 透彻理解三板斧之三:解密SparkStreaming运行机制和架构进阶.
//设置batchDuration时间间隔
val ssc =new StreamingContext (conf,Seconds
(5))
真正的调度 ssc.start
在StreamingContext调用start方法的内部其实是一次启动JobScheduler的start方法,进入消息循环。
在调用Scheduler内部构造JobGenerator和ReceiverTracker,并且调用JobGenerator和ReceiverTracker的start方法。JobGenerator启动后不断根据BatchDuration生成job
ReceiverTracker启动后在集群中启动Receiver,首先启动ReceiverSupersivor
数据通过ReceiverSupersivor 存储到Executor并把数据的Metadata信息发送到Driver的ReceiverTracker,在ReceiverTracker内部通过ReceiverdBlockTracker来管理接收到的数据
有了job,有了数据,要产生RDD,怎么表达业务逻辑呢,要依赖于DstreamGraph,线程池复制,提交到cluster
每个BatchInterval会产生一个具体的job,其实这里的JOB不是SPARK CORE
中所指的JOB,只是基于DstreamGraph而生成的RDD的DAG而已,从JAVA角度,相对于Runnable接口实例,此时想运行job需要提交到JobScheduler,在JobsCheduler中通过单独的线程提交job到集群运行,其实在线程中基于RDD的ACtion触发作业的运行。为什么使用线程池呢?
1、作业不断生成,提升效率,需要线程池
2、有可能设置的Job的FAIR公平调度的方式,也需要多线程的支持
容错
1、job级别
2、executor级别接收数据安全性,执行数据安全性