

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

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

如果缺少由其保存点引用的 In-progress 部件文件，则从快照启动`FileNotFoundException`时，适用于 Apache Flink 应用程序的托管服务可能会遇到 In-progress 部分文件。出现这种故障模式时，Managed Service for Apache Flink 应用程序的操作员状态通常是不可恢复的，必须在不使用快照的情况下重新启动。`SKIP_RESTORE_FROM_SNAPSHOT`参见以下示例堆栈跟踪：

```
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/)支持的文件系统。鉴于传入的流可以不受限制，因此将数据组织成大小有限的部分文件，并在写入数据时添加新文件。零件生命周期和展期政策决定了零件文件的时间、大小和命名。

在检查点和保存指向（快照）期间，所有待处理文件都将被重命名并提交。但是， In-progress 部分文件不会提交，而是重命名，其引用保留在检查点或保存点元数据中，以便在还原作业时使用。这些 In-progress 部分文件最终将变为 “待处理”，由随后的检查点或保存点重命名并提交。

以下是 In-progress 零件文件丢失的根本原因和缓解措施：
+ 用于启动适用于 Apache Flink 的托管服务应用程序的陈旧快照 — 只有在应用程序停止或更新时拍摄的最新系统快照才能用于通过 Amazon S3 启动适用于 Amazon Flink 的托管服务应用程序。 StreamingFileSink为避免此类故障，请使用最新的系统快照。
  + 例如，当您在停止或更新期间选择使用创建的快照`CreateSnapshot`而不是系统触发的快照时，就会发生这种情况。旧快照的保存点保留了对已由后续检查点或保存点重命名和提交的 In-progress 部件文件的过时引用。
  + 当从非最新 Stop/Update 事件中选择系统触发的快照时，也会发生这种情况。例如，已禁用系统快照但已`RESTORE_FROM_LATEST_SNAPSHOT`配置的应用程序。通常，使用 Amazon S3 的 Apache Flink 应用程序的托管服务 StreamingFileSink 应始终启用和`RESTORE_FROM_LATEST_SNAPSHOT`配置系统快照。
+ In-progress 已移除部分文件 — 由于分段文件位于 S3 存储桶中，因此其他有权访问该存储桶的组件或参与者可以将其删除。 In-progress 
  + 当您停止应用程序的时间过长且 [S3 存储桶 MultiPartUpload](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-abort-incomplete-mpu-lifecycle-config.html)生命周期策略删除了应用程序的 savepoint 引用的 In-progress 部分文件时，就会发生这种情况。为避免此类故障，请确保您的 S3 Bucket MPU 生命周期策略涵盖的期限足够长，足以满足您的用例。
  + 当 In-progress 零件文件被手动移除或被系统的另一个组件删除时，也可能发生这种情况。为避免此类故障，请确保 In-progress 零件文件不会被其他角色或组件删除。
+ 在 savepoint 之后触发自动检查点的争用条件 — 这会影响 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 会触发保存点并分两步停止应用程序。如果在这两个步骤之间触发了自动检查点，则该保存点将无法使用，因为其 In-progress 部分文件将被重命名并可能被提交。