

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

# S3 StreamingFileSink FileNotFoundExceptions
<a name="troubleshooting-s3sink"></a>

如果缺少由儲存點參照的進行中分段檔案，則從快照開始時，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`寫入檔案系統支援[的檔案系統](https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/deployment/filesystems/overview/)。鑒於傳入串流可以無限制，資料會組織成有限大小的分段檔案，並在寫入資料時新增檔案。分段生命週期和輪替政策可決定分段檔案的時間、大小和命名。

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

以下是遺失進行中分段檔案的根本原因和緩解措施：
+ 用於啟動 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](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-abort-incomplete-mpu-lifecycle-config.html) 生命週期政策移除了應用程式儲存點所參考的進行中部分檔案時，就可能會發生這種情況。若要避免此類失敗，請確保 S3 儲存貯體 MPU 生命週期政策針對您的使用案例涵蓋了足夠長的期間。
  + 當進行中的分段檔案已手動移除或由系統的其他元件移除時，也會發生這種情況。若要避免此類失敗，請確定進行中的分段檔案不會被其他參與者或元件移除。
+ 在儲存點之後觸發自動檢查點的競爭情形 — 這會影響 Managed Service for Apache Flink 1.13 及以下版本。此問題已在 Managed Service for Apache Flink 1.15 版中修正。將您的應用程式遷移至最新版本的 Managed Service for Apache Flink，以防止重複發生。我們還建議您從 StreamingFileSink 移轉至 [FileSink](https://nightlies.apache.org/flink/flink-docs-release-1.19/docs/connectors/datastream/filesystem/#file-sink)。
  + 應用程式停止或更新後，Managed Service for Apache Flink 會觸發儲存點，並透過兩個步驟停止應用程式。如果在這兩個步驟之間觸發了自動檢查點，則儲存點將無法使用，因為其進行中分段檔案將會重新命名並可能遞交。