第92講 SparkStreming中的Transformations和狀態管理

有興趣想學習國內整套Spark+Spark Streaming+Machine learning最頂級課程的,可加我qq  471186150。共享視頻,性價比超高!

本期內容:

1.SparkStreaming中的Transforamtions

2.SparkStreaming中的狀態管理

一.DStream就是一個RDD之上的一個抽象,DStream和時間結合起來就不斷的觸發產生RDD的實例,可以說我們對Dstream的操作就初步定義了對RDD的操作,只不過需要時間的間隔也就是internalbatch去激活這個模板,生成具體的RDD的實例和具體的job.

二.我們鼓勵Repartition,更多的是把更多的partition變成更少的partition,進行流的碎片的整理,我們不太鼓勵把更少的partition變成更多的partion,因爲會牽扯shuffle。

三.DStream是離散流,離散流就沒狀態,除了計算每個時間間隔產生一個job,我們還有必要計算過去十分鐘或者半個小時,所以這個時候我們需要維護這個狀態。後臺spark提供了專門維護這個狀態的函數updateStateByKey(func),即基於key,我們可以進行多個狀態的維護。因爲你可以把每一個時間間隔都做爲一個狀態,例如每一秒鐘做爲一個狀態,我算下過去十分鐘或者半個小時。值的更新就是通過傳進來的func函數。

四.Transform

transform(func)

Return a new DStream by applying a RDD-to-RDD function to every RDD of the source DStream. This can be used to do arbitrary RDD operations on the DStream.

編程的邏輯是作用於RDD

Transform操作,允許任意的RDD和RDD的操作被應用在DStream上。他可以使這些RDD不容易暴露在DstreamAPI中。比如讓兩個batch產生join操作而不暴露在DstreamAPi中,然後你可以很容易的使用transform來做這。這將是非常有作用的,例如,能夠將實時數據清理通過將輸入的數據流和預先計算的垃圾信息過濾掉。

五.UpdateByKey

updateStateByKey(func)

Return a new "state" DStream where the state for each key is updated by applying the given function on the previous state of the key and the new values for the key. This can be used to maintain arbitrary state data for each key.

UpdaeStateByKey的操作,允許你維護任意的不斷通過新的信息來更新的狀態。使用這個函數你必須遵守兩個步驟

1.定義一個狀態:這個狀態可以是任意的數據類型

2.定義一個狀態更新函數:怎麼樣去使用從一個數據流中產生的舊的狀態和新的狀態來更新出一個狀態。

六.forecachRDD(func)

foreachRDD(func)

The most generic output operator that applies a function, func, to each RDD generated from the stream. This function should push the data in each RDD to an external system, such as saving the RDD to files, or writing it over the network to a database. Note that the function func is executed in the driver process running the streaming application, and will usually have RDD actions in it that will force the computation of the streaming RDDs.

mapWithState將流式的狀態管理性能提高10倍以上

foreachRDD(func)中的函數func是作用於最後一個RDD,也就是結果RDD,如果RDD沒有數據,就不需要進行操作,foreachRDD()可以將數據寫在Redis/Hbase/數據庫/具體文件中,foreachRDD是在Driver程序中執行的,func就是action。

七.updateStateByKey

val cogroupedRDD = parentRDD.cogroup(prevStateRDD, partitioner)
val stateRDD = cogroupedRDD.mapPartitions(finalFunc, preservePartitioning)
Some(stateRDD)

 

cogroup是性能的瓶頸,所有的老數據,過去的數據都要進行cogroup操作,即使新的數據pairedRDD只有一條記錄,也要把所有的老記錄都要進行cogroup操作。這時相當耗時的。理論上講,只應對這條記錄對應的key和歷史的一批數據中對應的這個key進行更新操作就行了,而它更新全部的,99%的時間都是浪費和消耗。性能非常低。也會產生shuffle。而下面的MapWithState則只更新你必須要更新的,所以極大提升了性能。

MapWithState只需要更新你必須更新的,沒有必要更新所有的記錄,官方宣傳這個api會把流式的狀態管理性能提升10倍以上。

 

 

發佈了39 篇原創文章 · 獲贊 9 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章