簡體   English   中英

Spark Streaming異常處理策略

[英]Spark Streaming exception handling strategies

我有一個pyspark流作業,可從s3流目錄(使用textFileStream )。 輸入的每一行都經過解析,並在hdfs上輸出為拼花格式。

在正常情況下,這很好用。 但是,出現以下錯誤情況之一時,我有什么選擇來恢復丟失的批量數據?

  • 在驅動程序中對foreachRDD的調用中發生異常,在該調用中發生輸出操作(可能是HdfsError ,或者在輸出操作(例如partitionBy或dataframe.write.parquet() )期間發生了sql異常。 據我所知,這在Spark中被歸類為“動作”(相對於“轉換”)。
  • 執行程序中發生異常,可能是因為解析行時map()lambda中發生了異常。

我正在建立的系統必須是記錄系統。 我所有的輸出語義都符合Spark Streaming文檔中關於一次准確的輸出語義(如果必須重新計算批處理/ RDD,則輸出數據將被覆蓋,而不是重復)。

如何處理輸出操作中的失敗(在foreachRDD內部)? AFAICT, foreachRDD內部發生的異常不會導致流作業停止。 實際上,我已經嘗試確定如何在foreachRDD創建未處理的異常以停止該工作,但一直無法這樣做。

假設驅動程序中發生未處理的異常。 如果需要更改代碼以解決該異常,則我的理解是我需要在繼續之前刪除檢查點。 在這種情況下,是否有一種方法可以從過去停止流作業的時間戳記開始過去的流作業?

一般來說,傳遞給類似mapPartitions的操作( mapfilterflatMap )的函數內部拋出的每個異常都應該是可恢復的。 完全沒有充分的理由使整個操作/轉換因單個格式錯誤的輸入而失敗。 確切的策略將取決於您的要求(忽略,記錄,保留以進行進一步處理)。 您可以在pyspark中的scala.util.Try等效項中找到一些想法

處理整個操作范圍的故障肯定更加困難。 由於一般來說,由於傳入的流量,它無法恢復或等待不是一種選擇,因此我會在出現故障時樂觀地重試,如果失敗則將原始數據推送到外部備份系統(例如S3)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM