S3 StreamingFileSink FileNotFoundExceptions - Managed Service for Apache Flink

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

S3 StreamingFileSink FileNotFoundExceptions

如果缺少由儲存點參照的進行中分段檔案,則從快照開始時,Managed Service for Apache Flink 應用程式可能會遇到進行中的分段檔案 FileNotFoundException。發生此失敗模式時,Managed Service for Apache Flink 應用程式的運算子狀態通常不可復原,必須在不使用快照的情況下使用 SKIP_RESTORE_FROM_SNAPSHOT 重新啟動。請參閱以下範例 stacktrace:

java.io.FileNotFoundException: No such file or directory: s3://amzn-s3-demo-bucket/pathj/INSERT/2023/4/19/7/_part-2-1234_tmp_12345678-1234-1234-1234-123456789012 at org.apache.hadoop.fs.s3a.S3AFileSystem.s3GetFileStatus(S3AFileSystem.java:2231) at org.apache.hadoop.fs.s3a.S3AFileSystem.innerGetFileStatus(S3AFileSystem.java:2149) at org.apache.hadoop.fs.s3a.S3AFileSystem.getFileStatus(S3AFileSystem.java:2088) at org.apache.hadoop.fs.s3a.S3AFileSystem.open(S3AFileSystem.java:699) at org.apache.hadoop.fs.FileSystem.open(FileSystem.java:950) at org.apache.flink.fs.s3hadoop.HadoopS3AccessHelper.getObject(HadoopS3AccessHelper.java:98) at org.apache.flink.fs.s3.common.writer.S3RecoverableMultipartUploadFactory.recoverInProgressPart(S3RecoverableMultipartUploadFactory.java:97) ...

Flink 會將記錄StreamingFileSink寫入檔案系統支援的檔案系統。鑒於傳入串流可以無限制,資料會組織成有限大小的分段檔案,並在寫入資料時新增檔案。分段生命週期和輪替政策可決定分段檔案的時間、大小和命名。

在檢查點和儲存點 (快照) 期間,所有待處理檔案都會重新命名並遞交。但是,進行中的分段檔案不會遞交而是重新命名,且其參考會保留在還原作業時要使用的檢查點或儲存點中繼資料內。這些進行中的分段檔案最終會輪替為「待處理」狀態,由後續檢查點或儲存點重新命名或遞交。

以下是遺失進行中分段檔案的根本原因和緩解措施:

  • 用於啟動 Managed Service for Apache Flink 應用程式的快照過時 — 只有停止或更新應用程式時所拍攝的最新系統快照可用來啟動使用 Amazon S3 StreamingFileSink 的 Managed Service for Apache Flink 應用程式。若要避免這類失敗,請使用最新的系統快照。

    • 例如,當您選擇使用 CreateSnapshot 建立的快照,而不是在停止或更新期間系統觸發的快照時,就會發生這種情況。較舊快照的儲存點會保留對進行中分段檔案的過期參考,而該檔案已由後續檢查點或儲存點重新命名並遞交。

    • 當選取上午系統快照觸發自非最新的停止/更新事件時,也可能發生這種情況。其中一個範例是已停用系統快照但已設定 RESTORE_FROM_LATEST_SNAPSHOT 的應用程式。一般而言,使用 Amazon S3 StreamingFileSink 的 Managed Service for Apache Flink 應用程式應始終啟用系統快照並設定 RESTORE_FROM_LATEST_SNAPSHOT

  • 移除進行中的分段檔案 — 由於進行中的分段檔案位於 S3 儲存貯體中,因此可以由其他可存取該儲存貯體的元件或參與者移除。

    • 當已停止應用程式太長時間,且 S3 儲存貯體 MultiPartUpLoad 生命週期政策移除了應用程式儲存點所參考的進行中部分檔案時,就可能會發生這種情況。若要避免此類失敗,請確保 S3 儲存貯體 MPU 生命週期政策針對您的使用案例涵蓋了足夠長的期間。

    • 當進行中的分段檔案已手動移除或由系統的其他元件移除時,也會發生這種情況。若要避免此類失敗,請確定進行中的分段檔案不會被其他參與者或元件移除。

  • 在儲存點之後觸發自動檢查點的競爭情形 — 這會影響 Managed Service for Apache Flink 1.13 及以下版本。Managed Service for Apache Flink 1.15 版已修正此問題。將您的應用程式遷移至最新版本的 Managed Service for Apache Flink,以防止重複。我們還建議您從 StreamingFileSink 移轉至 FileSink

    • 應用程式停止或更新後,Managed Service for Apache Flink 會觸發儲存點,並透過兩個步驟停止應用程式。如果在這兩個步驟之間觸發了自動檢查點,則儲存點將無法使用,因為其進行中分段檔案將會重新命名並可能遞交。