Driver容錯
- 思想:
- 周期性將Dstream的DAG持久化到文件 系統中,重新啟動Driver時重新加載DAG
- 實現:
- 啟動Driver自動重啟(ClusterManager支持該功能)
- standalone: 提交任務時添加
--supervise
參數
官方文檔鏈接 - yarn:設置
yarn.resourcemanager.am.max-attempts
或者spark.yarn.maxAppAttempts
spark on yarn參數配置 - mesos: 提交任務時添加 --supervise 參數
- standalone: 提交任務時添加
- 設置checkpoint
StreamingContext.setCheckpoint(hdfsDirectory)
- 支持從checkpoint中重啟
def createContext(checkpointDirectory: String): StreamingContext = {
val ssc = ???
ssc.checkpoint(checkpointDirectory)
ssc
}
val ssc = StreamingContext.getOrCreate(checkpointDirectory, createContext(checkpointDirectory))
Executor通用容錯
- 思路:
- spark 處理RDD失敗會通過lineage進行重做保證數據可靠
- 對于reduceByKey等Stateful操作重做的lineage較長的,強制啟動checkpoint,減少重做幾率
- 實現:
- 啟用checkpoint
ssc.setCheckpoint(checkpointDir)
Receiver容錯
- 思想:
- 接收到數據后先寫日志(WAL)到可靠文件系統中,后才寫入實際的RDD。如果后續處理失敗則成功寫入WAL的數據通過WAL進行恢復,未成功寫入WAL的數據通過可回溯的Source進行重放
- 實現:
- 啟用checkpoint
ssc.setCheckpoint(checkpointDir)
- 啟用WAL
sparkConf.set("spark.streaming.receiver.writeAheadLog.enable", "true")
對Receiver使用可靠性存儲
StoreageLevel.MEMORY_AND_DISK_SER
orStoreageLevel.MEMORY_AND_DISK_SER2
效果:
- 常規的數據流:Receiver提供
AtLeastOne
語義(可能重復)
spark-streaming-fault-tolerance-0.png
- 基于KafkaDirect的Receiver提供
ExactlyOne
語義,保證數據不丟不重復
spark-streaming-fault-tolerance.png
Graceful Stop 優雅停止
- 思想:
- 結束任務時等待處理中的任務結束,并保留當前工作狀態到checkpoint中,確保重啟任務后能獲取到正確的checkpoint
- 等待時間的設置(如何保證所有數據寫入checkpoint?, 一般設置成slideWindow的5-10倍)
- 實現: 有如下幾種:
- 設置spark.streaming.stopGracefullyOnShutdown為true
- 添加hook
sys.ShutdownHookThread {
println("Gracefully stopping Spark Streaming Application at"+ new Date())
ssc.stop(true, true)
println("Application stopped at"+ new Date())
}
StreamingContext代碼鏈接,graceful stop 邏輯見stop函數
TODO
- Kafka Direct如何保證 Exactly One
- 如何支持window容災?(個人YY的一個場景和自我理解,不確定是否正確)
window為5分鐘,slide為1分鐘的任務,執行到第100分鐘暫停后,checkpoint中的進度應該是[96,100], 10分鐘后啟動,此時需要的進度是[106,110],輸出數據會出現丟失?
spark-streaming使用的是系統時間,而非數據時間。雖然數據本身是連續的,但是到達spark-streaming的時間相關較久導致無法存入同一window,無法正常計算?