Spark Streaming的容錯和數據無丟失機制


spark是迭代式的內存計算框架,具有很好的高可用性。sparkStreaming作為其模塊之一,常被用於進行實時的流式計算。實時的流式處理系統必須是7*24運行的,同時可以從各種各樣的系統錯誤中恢復。

在實際使用中,容錯和數據無丟失顯得尤為重要。最近看了官網和一些博文,整理了一下對Spark Streaming的容錯和數據無丟失機制。

checkPoint機制可保證其容錯性。spark中的WAL用來改進恢復機制,保證數據的無丟失。

 

checkPoint機制介紹

Spark Streaming需要checkpoint足夠的信息到容錯存儲系統中, 以使系統從故障中恢復。有兩種數據是需要checkpointed.

- Metadata checkpointing: 保存流計算的定義信息到容錯存儲系統,如HDFS中。這用來恢復應用程序中運行driver的故障。元數據包括:

   - Configuration :創建Spark Streaming應用程序的配置信息

   - DStream operations :定義Streaming應用程序的操作集合

   - Incomplete batches:操作存在隊列中的未完成的批
- Data checkpointing :保存生成的RDD信息到可靠的存儲系統中,這在有狀態transformation(如結合跨多個批次的數據)中是必須的。
例如:在這樣一個transformation中,DAG中的Lineage過長,如果重算,則開銷太大。為了避免這種無限增長,有狀態的transformation的中間RDD將會定時地存儲到可靠存儲系統中。
在RDD計算中,通過檢查點機制進行容錯,傳統做檢查點有兩種方式:通過冗余數據和日志記錄更新操作。RDD中的doCheckPoint方法相當於通過冗余數據來緩存數據,而(Lineage)血統就是通過相當粗粒度的記錄更新操作來實現容錯的。

元數據checkpoint主要是為了從driver故障中恢復數據。數據checkpoint能節省RDD恢復性能。

 

WAL介紹

對於一些文件的數據源,driver的恢復機制可以保證數據無丟失,因為所有的數據都保存在HDFS或S3上面,對於一些像kafka,flume等數據源,接收的數據保存在內存中將有可能丟失,這是因為spark應用分布式運行的,如果driver進程掛了,所有的executor進程將不可用,保存在這些進程所持有內存中的數據將會丟失。為了避免這些數據的丟失,spark streaming中引入了一個write ahead logs。

WAL在文件系統和數據庫中用於數據操作的持久化,先把數據寫到一個持久化的日志中,然后對數據做操作,如果操作過程中系統掛了,恢復的時候可以重新讀取日志文件再次進行操作。對於像kafka和flume這些使用接收器來接收數據的數據源。接收器作為一個長時間的任務運行在executor中,負責從數據源接收數據,如果數據源支持的話,向數據源確認接收到數據,然后把數據存儲在executor的內存中,driver在exector上運行任務處理這些數據。

如果wal啟用了,所有接收到的數據會保存到一個日志文件中去(HDFS), 這樣保存接收數據的持久性,此外,如果只有在數據寫入到log中之后接收器才向數據源確認,這樣drive重啟后那些保存在內存中但是沒有寫入到log中的數據將會重新發送,這兩點保證的數據的無丟失。

當一個Spark Streaming應用啟動了, 相應的StreamingContext使用SparkContet去啟動receiver,receiver是一個長時間執行的作業,這些接收器接收並保存這些數據到Spark的executor進程的內存中,這些數據的生命周期如下圖所示

1)藍色的箭頭表示接收的數據,接收器把數據流打包成塊存儲在的內存中,如果開啟了WAL,將會把數據寫入到存在容錯文件系統的日志文件中

2)青色的箭頭表示提醒driver, 接收到的數據塊的元信息發送給driver中的StreamingContext, 這些元數據包括:executor內存中數據塊的引用ID和日志文件中數據塊的偏移信息

3)紅色箭頭表示處理數據,每一個批處理間隔,StreamingContext使用塊信息用來生成RDD和jobs.  SparkContext執行這些job用於處理executor內存中的數據塊

4)黃色箭頭表示checkpoint這些計算,以便於恢復。流式處理會周期的被checkpoint到文件中

當一個失敗的driver重啟以后,恢復流程如下

1)黃色的箭頭用於恢復計算,checkpointed的信息是用於重啟driver,重新構造上下文和重啟所有的receiver

2)青色箭頭恢復塊元數據信息,所有的塊信息對已恢復計算很重要重新生成未完成的job(紅色箭頭),會使用到恢復的元數據信息

3)讀取保存在日志中的塊(藍色箭頭),當job重新執行的時候,塊數據將會直接從日志中讀取

4)重發沒有確認的數據(紫色的箭頭)。緩沖的數據沒有寫到WAL中去將會被重新發送。

 


免責聲明!

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



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