从job角度看sparkStreaming
回顾前文,JobGenerator
维护了一个定时器,周期就是我们刚刚提到的 batchDuration
,定时为每个 batch 生成 RDD DAG 的实例,DStreamGraph.generateJobs(time)
将返回一个 Seq[Job]
,其中的每个 Job
是一个 ForEachDStream
实例的 generateJob(time)
返回的结果。JobScheduler
收到 jobSet
后
处理逻辑是 job => jobExecutor.execute(new JobHandler(job))
然后是run();
而 Spark Streaming 里也有一个 Job
,但此 Job
非彼 Job
。Spark Streaming 里的 Job
更像是个 Java
里的 Runnable
,可以 run()
一个自定义的 func
函数.
回到JobGenerator启动,ssc.start()启动后,会JobGenerator.start(),会先判断是否存在checkpoints,否则会先重启。
JobGenerator 维护了一个定时器,会定时发送消息,导致结束消息,调用generateJobs(time)催生job生成流程5个步骤:
new RecurringTimer(clock, ssc.graph.batchDuration.milliseconds,
longTime => eventLoop.post(GenerateJobs(new Time(longTime))), "JobGenerator")
- 要求
ReceiverTracker
将目前已收到的数据进行一次 allocate,即将上次 batch 切分后的数据切分到到本次新的 batch 里 - 要求
DStreamGraph
复制出一套新的 RDD DAG 的实例,具体过程是:DStreamGraph
将要求图里的尾DStream
节点生成具体的 RDD 实例,并递归的调用尾DStream
的上游DStream
节点……以此遍历整个DStreamGraph
,遍历结束也就正好生成了 RDD DAG 的实例 - 获取第 1 步
ReceiverTracker
分配到本 batch 的源头数据的 meta 信息 - 将第 2 步生成的本 batch 的 RDD DAG,和第 3 步获取到的 meta 信息,一同提交给
JobScheduler
异步执行 - 只要提交结束(不管是否已开始异步执行),就马上对整个系统的当前运行状态做一个 checkpoint