標籤:

Spark Streaming容錯性和零數據丟失

對於spark streaming 容錯性的研究,其目的就是保證數據零丟失。

預寫日誌

預寫日誌一般情況下用於資料庫和文件系統中,用來保證數據的持久性。

工作原理:

首先,將操作記入一個持久的日誌,其實就是保存數據操作記錄,假如哪天資料庫出現嚴重問題,可以通過保存操作記錄的日誌來重新操作資料庫來恢複數據,這樣就達到了數據持久化的目的。

我們在研究kafka和spark streaming做實時數據處理,通常會發現kafka或flume使用receiver(接收器)來接受數據,並且receiver會長期駐守在executor中運行,其功能主要是兩個:(1)負責從數據源處接受數據;(2)確認收到數據;另外將接受到的數據保存在executor的內存中,driver在executor中運行來處理這些數據。

如果我們設置了預寫日誌,在所有數據保存在內存的同時,還會把數據寫入到具有容錯性的文件系統中,即便是spark streaming運行任務失敗之後,我們也可通過預寫日誌恢復。另外receiver為了保證數據的完整性和準確性,需要將在接受數據之後完成確認數據的過程,而這個過程是在完成預寫日誌之後被確認,但還有已經緩存在內存中數據,如果遇到spark streaming運行失敗的情況下,這類數據將會在服務重啟之後重新發送,這樣就保證了數據的零丟失。

配置選項

上面的預寫日誌的原理講解,我們需要實際的操作:

(1)通過streamingContext.checkpoint(path-to-directory)設置檢查點的目錄。

這個目錄保存了checkpoint和WAL的信息。

(2) spark.streaming.receiver.writeAheadLog.enable為True

注意:

當使用預寫日誌時,就會出現數據吞吐量的降低,這是在所難免的,在這種情況下,我們需要增加spark處理任務的並行度。

如果想要恢復緩存的數據,就要使用具有acking的數據源,kafka、flume都是這種類型的。因此spark與kafka、flume的內部機制就能解決這些問題。

輸入的流數據被receiver在接受數據之後,一方面將block寫入executor的內存中,另一方面還會將數據寫入到具有容錯機制的文件系統中;

當將block寫入到文件系統完成後,會將block metatdata信息發送給streaming context;元數據信息包括:(1)在executor中的block塊的reference Id,(2)block數據在日誌中的offset

Streaming Context通過運行任務來處理executor內存中的塊執行任務;

周期性的設置檢查點並且保存日誌到文件系統的另一種文件中。

如果當driver執行任務失敗或者出現異常,就會有上圖中的數據恢復的保障機制;

(橙色)使用checkpoint重啟driver,重新構造spark context和重啟接收器。

(綠色)使用預寫日誌恢復spark context中的block metadata

(藍色)使用容錯文件系統中的預寫日誌恢復executor中的block

另外緩存中數據也可以通過重發流數據來恢復。


推薦閱讀:

Scala 究竟好在那裡?
hadoop 和spark如何系統的學習?
數據科學家必知必會的7款Python工具,你會幾個?
【博客存檔】Machine Learning With Spark Note 5:構建聚類模型

TAG:Spark |