S3 StreamingFileSink FileNotFoundExceptions - Managed Service for Apache Flink

Amazon Managed Service for Apache Flink 之前稱為 Amazon Kinesis Data Analytics 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://your-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寫入 File Systems 支援的檔案系統。鑒於傳入串流可以無限制,資料會組織成有限大小的分段檔案,並在寫入資料時新增檔案。分段生命週期和輪替政策可決定分段檔案的時間、大小和命名。

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

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

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

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

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

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

    • 當您停止應用程式的時間過長,且 SS3儲存貯 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 會觸發儲存點,並透過兩個步驟停止應用程式。如果在這兩個步驟之間觸發了自動檢查點,則儲存點將無法使用,因為其進行中分段檔案將會重新命名並可能遞交。