第6课:Spark Streaming源码解读之Job动态生成和深度思考

本文深入探讨了Spark Streaming中Job的生成机制与源码解析,包括流处理的意义、Job生成的具体步骤及其背后的逻辑,以及如何通过理解这些机制来优化Spark Streaming应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本課內容是

  1. Job 生成的深度思考 
  2. Job 生成源碼解析

Job 生成的深度思考 

一切不是流處理的數據或者是跟流處理沒有關係的數據,最終都會變成沒有價值的數據。

意義上的流處理其實就是批處理加上時間維度構成的。比如說作業生成一般都會有定時任務,是批處理 (Batch Process) 加上定時器 (Scheduler)或者是定條件 (Event Trigger)來觸發作業。Spark Streaming 的 Job 是根據固定的時間會自動生成Job,所以一切的處理可以說是流處理,只是時間長短已而。

Spark Streaming 要基於時間不斷的去管理我們生成的作業,是用一個方法去定義要處理的業務邏輯,如果方法不調用的話,就執行不了就不會生成Job。

所以在這個時候我們每個作業又由於有 Action 級別的操作,Action  級別是對 DStream 進行操作,它是邏輯級別,它生成每個 Job 放在對列的時候,他一定會被翻譯成基於RDD 的操作,這個基於RDD 的操作的Job最後一個 RDD 一定是 Action 級別的,最後就會觸發然後生成作業。

 

Job 生成源碼解析

 

我們從最基本的那個程序開始看。

 

 

這個就是我們所說的 Batch Duration, 每5秒鍾 JobGenerator 都會產生一個 Job, 這個 Job 是邏輯級別,所謂邏輯級別就是,說有這個 Job, 並且這個 Job 具體該怎麼去做, 但是他還沒有做, 誰去做 ,是由底層的物理級別的 RDD 的 Action 觸發的,Spark Streaming 是基於 DStream 的 依賴關係,DStream 的 Action 也是邏輯級別的。

SparkStreaming.start() 方法 里面調度了 scheuler.start( ) 方法

JobScheduler 的 Start( ) 方法 里面調度了 receiverTracker and jobGenerator 的 start( ) 方法

然後再看一下 JobGenerator 的 start( ) 方法,里面有一個 eventLoop, 消息循環體,因為它不斷的生成 Job

如果所有都是第一次的話,就會調度 startFirstTime( ) 方法

里面有一個Timer 是創建一個新的RecurringTimer的類

然後里面的start()方法會調度thread.start( ) 開一條新的 Thread.

回去 JobGenerator 的 start( ) 方法,創建新的 eventLoop 然後調度一個 onReceiver()方法,這個方法里會調度 processEvent( )方法

這個JobGenerator 類里的 generateJobs方法做了5個步驟:

第一步,創建 receiverTacker,跟據我們的時間,分配時間數據,他接收到是元數據。metadata,based on metadata to allocate the block

第二步,基於 DStreamGraph, RDD 的依賴關係,創建Job


 

把業務邏輯 放在一個 functional variable: jobFunc里

這里有一個 getOrCompute 方法,里面就是把 基於時間不斷的創建 DStreamRDD

第三步,獲取JobSechduler的 Input Into

第四步,如果成功的話,要獲取的數據,然後生成一個 JobSet submitJobSet( ) 方法里有創建 JobHandler

這是一個 runnable 接口,這時候 Job 就生成了。

第五步,進行checkpoint

總結

1. SparkStreaming.start( ) call jobScheduler.start( ) and receiverTracker.start( )

2. 在 JobGenerator的start( )方法里會調度其他的方法,例如:eventLoop.start( ), 然後會判斷有沒有 checkpoint,沒有的話就直接調度startFirstTime( ) 方法。這里還會創建一個新的 eventLoop 的實例調度里面的 onReceiver( )方法,onReceiver 方法是一個abstract 級別的方法,在這里的具體實現是調度 JobGenerator.generateJob( )方法。這個很關鍵,因為有里面發生了五個步驟:其中有調度基於 DStreamGraph 的 generateJob( )方法,創建不同的 RDD,還有就是調度jobScheduler 的 submitJobSets 和 創建 JobHandler 這個 runnable 接口 去 觸發作業的執行。

Job 生成流程圖

 

Thanks for reading

Janice

——————————————————————————————–
Reference: DT大数据梦工厂SPARK版本定制課程 – 第6课:Spark Streaming源码解读之Job动态生成和深度思考

 

Sharing is Good, Learning is Fun.


今天很残酷、明天更残酷,后天很美好。但很多人死在明天晚上、而看不到后天的太阳。 –马云 Jack Ma


 

转载于:https://my.oschina.net/jcchoiling/blog/675082

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值