Spark Streaming容錯語義

2018-11-26 16:30 更新

Spark Streaming容錯語義

這一節(jié),我們將討論在節(jié)點錯誤事件時Spark Streaming的行為。為了理解這些,讓我們先記住一些Spark RDD的基本容錯語義。

  • 一個RDD是不可變的、確定可重復計算的、分布式數(shù)據(jù)集。每個RDD記住一個確定性操作的譜系(lineage),這個譜系用在容錯的輸入數(shù)據(jù)集上來創(chuàng)建該RDD。
  • 如果任何一個RDD的分區(qū)因為節(jié)點故障而丟失,這個分區(qū)可以通過操作譜系從源容錯的數(shù)據(jù)集中重新計算得到。
  • 假定所有的RDD transformations是確定的,那么最終轉(zhuǎn)換的數(shù)據(jù)是一樣的,不論Spark機器中發(fā)生何種錯誤。

Spark運行在像HDFS或S3等容錯系統(tǒng)的數(shù)據(jù)上。因此,任何從容錯數(shù)據(jù)而來的RDD都是容錯的。然而,這不是在Spark Streaming的情況下,因為Spark Streaming的數(shù)據(jù)大部分情況下是從網(wǎng)絡(luò)中得到的。為了獲得生成的RDD相同的容錯屬性,接收的數(shù)據(jù)需要重復保存在worker node的多個Spark executor上(默認的復制因子是2),這導致了當出現(xiàn)錯誤事件時,有兩類數(shù)據(jù)需要被恢復

  • Data received and replicated :在單個worker節(jié)點的故障中,這個數(shù)據(jù)會幸存下來,因為有另外一個節(jié)點保存有這個數(shù)據(jù)的副本。
  • Data received but buffered for replication:因為沒有重復保存,所以為了恢復數(shù)據(jù),唯一的辦法是從源中重新讀取數(shù)據(jù)。

有兩種錯誤我們需要關(guān)心

  • worker節(jié)點故障:任何運行executor的worker節(jié)點都有可能出故障,那樣在這個節(jié)點中的所有內(nèi)存數(shù)據(jù)都會丟失。如果有任何receiver運行在錯誤節(jié)點,它們的緩存數(shù)據(jù)將會丟失
  • Driver節(jié)點故障:如果運行Spark Streaming應用程序的Driver節(jié)點出現(xiàn)故障,很明顯SparkContext將會丟失,所有執(zhí)行在其上的executors也會丟失。

作為輸入源的文件語義(Semantics with files as input source)

如果所有的輸入數(shù)據(jù)都存在于一個容錯的文件系統(tǒng)如HDFS,Spark Streaming總可以從任何錯誤中恢復并且執(zhí)行所有數(shù)據(jù)。這給出了一個恰好一次(exactly-once)語義,即無論發(fā)生什么故障,所有的數(shù)據(jù)都將會恰好處理一次。

基于receiver的輸入源語義

對于基于receiver的輸入源,容錯的語義既依賴于故障的情形也依賴于receiver的類型。正如之前討論的,有兩種類型的receiver

  • Reliable Receiver:這些receivers只有在確保數(shù)據(jù)復制之后才會告知可靠源。如果這樣一個receiver失敗了,緩沖(非復制)數(shù)據(jù)不會被源所承認。如果receiver重啟,源會重發(fā)數(shù)據(jù),因此不會丟失數(shù)據(jù)。
  • Unreliable Receiver:當worker或者driver節(jié)點故障,這種receiver會丟失數(shù)據(jù)

選擇哪種類型的receiver依賴于這些語義。如果一個worker節(jié)點出現(xiàn)故障,Reliable Receiver不會丟失數(shù)據(jù),Unreliable Receiver會丟失接收了但是沒有復制的數(shù)據(jù)。如果driver節(jié)點出現(xiàn)故障,除了以上情況下的數(shù)據(jù)丟失,所有過去接收并復制到內(nèi)存中的數(shù)據(jù)都會丟失,這會影響有狀態(tài)transformation的結(jié)果。

為了避免丟失過去接收的數(shù)據(jù),Spark 1.2引入了一個實驗性的特征write ahead logs,它保存接收的數(shù)據(jù)到容錯存儲系統(tǒng)中。有了write ahead logs和Reliable Receiver,我們可以做到零數(shù)據(jù)丟失以及exactly-once語義。

下面的表格總結(jié)了錯誤語義:

Deployment ScenarioWorker FailureDriver Failure
Spark 1.1 或者更早, 沒有write ahead log的Spark 1.2在Unreliable Receiver情況下緩沖數(shù)據(jù)丟失;在Reliable Receiver和文件的情況下,零數(shù)據(jù)丟失在Unreliable Receiver情況下緩沖數(shù)據(jù)丟失;在所有receiver情況下,過去的數(shù)據(jù)丟失;在文件的情況下,零數(shù)據(jù)丟失
帶有write ahead log的Spark 1.2在Reliable Receiver和文件的情況下,零數(shù)據(jù)丟失在Reliable Receiver和文件的情況下,零數(shù)據(jù)丟失

輸出操作的語義

根據(jù)其確定操作的譜系,所有數(shù)據(jù)都被建模成了RDD,所有的重新計算都會產(chǎn)生同樣的結(jié)果。所有的DStream transformation都有exactly-once語義。那就是說,即使某個worker節(jié)點出現(xiàn)故障,最終的轉(zhuǎn)換結(jié)果都是一樣。然而,輸出操作(如foreachRDD)具有at-least once語義,那就是說,在有worker事件故障的情況下,變換后的數(shù)據(jù)可能被寫入到一個外部實體不止一次。利用saveAs***Files將數(shù)據(jù)保存到HDFS中的情況下,以上寫多次是能夠被接受的(因為文件會被相同的數(shù)據(jù)覆蓋)。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號