spark大數據處理技術讀書筆記:spark streaming學習筆記

第十章:spark streaming 流數據處理框架

一。spark streaming程序的幾個步驟

1.創建StreamingContext。sparkstreaming context和spark context創建區別不大,唯一要加的就是streaming context需要添加一個Seconds(1),指定處理數據的時間間隔。就是batchDuration,而且該處理間隔一旦設定就沒法改變。1就是爲每隔一秒處理一次數據。

2.創建InputDStream

如果storm的spout,sparkstreaming也需要指明數據源。比如socketTextStream將用套接字作爲數據源讀取數據。同時也支持kafkaStream,flumeStream,fileStream,networkStream,mqttStream,zeroMQStream

3.操作Dstream

 Dstream是包含了一系列的RDD,這些RDD可以從數據源來,也可以從轉換操作來。比如對從數據源得到的數據首先進行分詞,然後利用mapreduce算法映射和計算、最後用print()輸出結果。

4.啓動Spark Streaming

當ssc.start()啓動後,程序才真正開始進行所有預期的操作。

二。spark streaming基本概念

1.滑動間隔和窗口間隔都是批處理間隔的整數倍,窗口間隔是有重合的,但是spark保證了處理不會重複。

2.DStream的操作最終還是要通過RDD的操作來實現,不過是DStream提升了抽象程度,隱藏了具體的實現細節。

3.DStream操作函數

repartition(num) 改變DStream的分片數量

union(otherStream)跟其他的stream合併。

count()返回原DStream中各個RDD中元素的個數。

reduce(func)

reduceByKey(func)按照key對元素通過func進行聚合,本地環境並行度是2,集羣環境並行度是8

join()  原來是DStream[(k,v)] 變成DStream[(k,(v,w))]

等等 p236頁

三。性能調優

1.運行時間優化

增加並行度。把任務分散到多個節點上,特別是含有shuffle的操作

減少序列化負擔,spark默認對接收到的數據是序列化存儲,減少內存,所以使用自定義的序列化方式或者更搞笑的序列化方式更好。

設置合理的批處理間隔,若在間隔範圍內沒處理完,這就不好了,後面會不斷堆積

減少任務提交和分發帶來的負擔,如果批處理時間間隔小的話,會不停的進行任務提交和分發,就不太好。

2.內存使用優化

控制批處理間隔數據量,過大處理起來,內存會存不下

及時清理不用的,最好是spark.streaming.unpersist()設置爲true,可以自動回收。

觀察和調整GC

四,容錯

通過rdd的依賴關係進行恢復。能從原始數據集中恢復出來。所有中間結果都是可被計算的。

工作節點失效。數據源不丟失,就不會丟失。

驅動節點失效。從斷點繼續讀取,啓動時指定StreamingContext.getOrCreate,記錄點記錄的數據是類序列化後的結果,因此若重新編譯代碼後反序列化就會出錯。

五。DStream作業的產生和調度

spark中,作業是由一系列有繼承關係的RDD和作用在其上的函數所組成的完整的操作鏈。並由輸出RDD向DAGScheduler提交操作鏈來提交作業。

spark是按照輸出操作來判斷作業產生的,有多少個輸出就有多少個作業。作業內或許有依賴,這些作業會註冊到DStreamGraph中等待提交執行。

作業調度是在每個批處理間隔的時間點到來,註冊在DStreamGraph中的作業會被取出來放進JobScheduler進行調度和提交。

a.sparkStreaming內部維護了週期性的定時器,超時間隔就是預先設置的批處理間隔。超時後就請求DStreamGraph來產生streaming作業

b.JobScheduler內部維護線程池來運行作業。默認是1,可以通過concurrentJobs來配置。

c.最終從Graph中得到的作業還是轉換成spark作業來處理,通過spark的spark scheduler來處理。

六。DStream和RDD的關係。

DStream內部可以分爲下面三個部分。

1.一組基於操作鏈的依賴關係。就是該DStream所依賴的父DStream

2.批處理間隔

3.一個計算RDD的函數compute()。getOrCompute()函數會在其內部遞歸調用操作鏈上的所有的DStream的compute函數,來獲得新的RDD,該RDD就是記錄了完整的執行任務的操作鏈。


二。時間和窗口概念

sparkStreaming系統要等到數據彙總到一定的量後再一併操作,這個間隔就是批處理間隔。決定了提交作業的頻率和數據處理的延時,同樣也影響着數據處理的吞吐量和性能。

2.1滑動間隔(slide duration)和窗口間隔(window duration)

這兩個間隔都是批處理間隔的整數倍,處理數據的間隔取決於滑動間隔,所使用的數據量是窗口間隔來決定的。從字面意義上來說,滑動間隔其實就窗口要開始滑動的時候,比如長度爲四的窗口間隔,如果滑動間隔爲2,那麼在這四個批處理間隔內,會有兩次的滑動操作,這兩次的滑動操作中,會有兩個批處理間隔的數據會重複的,但是sparkstreaming系統中做了優化,不會讓重複計算髮生,同時因爲多次處理了很多數據,從而提升了處理速度。

2.2DStream 離散數據流 

從英文意思上看,就是從多個分佈式數據源中收集到的數據流,離散數據流DStream有三種操作,一種是普通的轉換操作,一種是基於窗口的變換操作,一種是輸出操作。轉換操作不會產生和提交作業,只構成DStream操作鏈 比如flatmap,filter,count reduce等

窗口的變換操作,將轉換操作和窗口操作合併後得到的操作  reduceByWindow reduceByKeyAndWindow,窗口操作會在其內部隱式的將DStream中的RDD持久化到內存中而無須用戶顯示的調用。

輸出操作  foreachRDD   saveAsTextFile

3.作業產生

操作鏈定義完成,提交到DAGScheduler後,就會產生作業了,一個作業有多少個輸出就有多少個作業,作業之間可能會有依賴,會根據依賴關係來處理作業。

4.作業產生後也不會立刻提交,而是等到streamingContext啓動後,在批處理間隔到來後纔會真正的被執行。

三。streaming作業與spark作業之間的關係。

DStream在內部維護了相應的RDD,無論是轉換操作還是輸出操作,都會最終被映射到RDD上,因此sparkStreaming可以自然而然的產生與之一一對應的spark作業。當在構建DStream操作鏈時,spark內部就在構建RDD操作鏈,這個RDD操作鏈最終會在其內部產生作業並提交運行。最後用runJob()提交作業。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章