從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