Spark-Streaming容錯機制學習

Driver容錯


  1. 思想:
  • 周期性將Dstream的DAG持久化到文件 系統中,重新啟動Driver時重新加載DAG
  1. 實現:
  • 啟動Driver自動重啟(ClusterManager支持該功能)
    • standalone: 提交任務時添加 --supervise 參數
      官方文檔鏈接
    • yarn:設置yarn.resourcemanager.am.max-attempts 或者spark.yarn.maxAppAttempts
      spark on yarn參數配置
    • mesos: 提交任務時添加 --supervise 參數
  • 設置checkpoint
    StreamingContext.setCheckpoint(hdfsDirectory)
    
  • 支持從checkpoint中重啟
def createContext(checkpointDirectory: String): StreamingContext = {
    val ssc = ???
    ssc.checkpoint(checkpointDirectory)
    ssc
}
val ssc = StreamingContext.getOrCreate(checkpointDirectory, createContext(checkpointDirectory))

Executor通用容錯


  1. 思路:
  • spark 處理RDD失敗會通過lineage進行重做保證數據可靠
  • 對于reduceByKey等Stateful操作重做的lineage較長的,強制啟動checkpoint,減少重做幾率
  1. 實現:
  • 啟用checkpoint
    ssc.setCheckpoint(checkpointDir)
    

Receiver容錯


  1. 思想:
  • 接收到數據后先寫日志(WAL)到可靠文件系統中,后才寫入實際的RDD。如果后續處理失敗則成功寫入WAL的數據通過WAL進行恢復,未成功寫入WAL的數據通過可回溯的Source進行重放
  1. 實現:
  • 啟用checkpoint
ssc.setCheckpoint(checkpointDir)
  • 啟用WAL
    sparkConf.set("spark.streaming.receiver.writeAheadLog.enable", "true")
    
  1. 對Receiver使用可靠性存儲StoreageLevel.MEMORY_AND_DISK_SER or StoreageLevel.MEMORY_AND_DISK_SER2

  2. 效果:

  • 常規的數據流:Receiver提供AtLeastOne語義(可能重復)
    spark-streaming-fault-tolerance-0.png
  • 基于KafkaDirect的Receiver提供ExactlyOne語義,保證數據不丟不重復
    spark-streaming-fault-tolerance.png

Graceful Stop 優雅停止


  1. 思想:
  • 結束任務時等待處理中的任務結束,并保留當前工作狀態到checkpoint中,確保重啟任務后能獲取到正確的checkpoint
  • 等待時間的設置(如何保證所有數據寫入checkpoint?, 一般設置成slideWindow的5-10倍)
  1. 實現: 有如下幾種:
  • 設置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

  1. Kafka Direct如何保證 Exactly One
  2. 如何支持window容災?(個人YY的一個場景和自我理解,不確定是否正確)

window為5分鐘,slide為1分鐘的任務,執行到第100分鐘暫停后,checkpoint中的進度應該是[96,100], 10分鐘后啟動,此時需要的進度是[106,110],輸出數據會出現丟失?

spark-streaming使用的是系統時間,而非數據時間。雖然數據本身是連續的,但是到達spark-streaming的時間相關較久導致無法存入同一window,無法正常計算?

參考文獻

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容