第十章: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()提交作業。