Spark Streaming源碼分析 – DStream


A Discretized Stream (DStream), the basic abstraction in Spark Streaming, is a continuous sequence of RDDs (of the same type) representing a continuous stream of data.
Dstream本質就是離散化的stream,將stream離散化成一組RDD的list,所以基本的操作仍然是以RDD為基礎
下面看到DStream的基本定義,對於普通的RDD而言,時間對於DStream是更為重要的因素
將stream切分成RDD的interval時間,stream開始的時間,DStream需要保留的RDD的時間,每個RDD所對於的時間key……

DStream抽象定義


getOrCompute
注意的是,這里是產生RDD對象,而不是真正的進行計算,只有在runjob時才會做真正的計算
Spark RDD本身是不包含具體數據的,只是定義了workflow(依賴關系),處理邏輯


generateJob
對於用getOrCompute產生的RDD對象,需要封裝成job
而Job的關鍵,jobFunc,其實就是想Spark集群提交一個job
這里只是使用了emptyFunc,具體的output邏輯是需要被具體的outputDStream改寫的


clearMetadata
清除過時的RDD對象,其中還會做unpersist,以及調用dependencies的clearMetadata

具體DStream的定義

FilteredDStream

 

WindowedDStream

image

 

ShuffledDStream

 

PairDStreamFunctions
以groupByKey為例,和普通Spark里面沒啥區別,依賴是基於combineByKey實現
比較有特點是提供groupByKeyAndWindow,其實就是先使用WindowedDStream將windows中的RDD union,然后再使用combineByKey

groupByKeyAndWindow

 

updateStateByKey

StateDStream
普通的DStream,都是直接從ParentRDD通過compute來得到當前的RDD
而StateDStream的特別之處,除了ParentRDD,還需要參考PreviousRDD,這個只存在在stream場景下,只有這個場景下,RDD之間才存在時間關系
PreviousRDD = getOrCompute(validTime - slideDuration),即在DStream的generatedRDDs上前一個時間interval上的RDD
處理函數,val finalFunc = (iterator: Iterator[(K, (Seq[V], Seq[S]))]) => { },需要3個參數,key,ParentRDD上的value,PreviousRDD上的value
處理函數需要考慮,當ParentRDD或PreviousRDD為空的情況

注意StateDStream,默認需要做persist和checkpoint

 

TransformedDStream
首先這是個比較通用的operation,可以通過自定義的transformFunc,將一組parentRDDs計算出當前的RDD
需要注意的是,這些parentRDDs必須在同一個streamContext下,並且有相同的slideDuration
在DStream接口中,可以提供transform和transformWith兩種,參考下面源碼



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM