S3 StreamingFileSink FileNotFoundExceptions - Managed Service for Apache Flink
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Amazon Managed Service for Apache Flink 之前称为 Amazon Kinesis Data Analytics for Apache Flink。

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

S3 StreamingFileSink FileNotFoundExceptions

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

java.io.FileNotFoundException: No such file or directory: s3://your-s3-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 将记录写入文件系统支持的文件系统。鉴于传入的流可以不受限制,因此将数据组织成大小有限的部分文件,并在写入数据时添加新文件。零件生命周期和展期政策决定了零件文件的时间、大小和命名。

在检查点和保存指向(快照)期间,所有待处理文件都将被重命名并提交。但是,正在处理的部分文件不会提交,而是会重命名,其引用保留在检查点或保存点元数据中,以便在恢复任务时使用。这些正在处理的零件文件最终将变为 “待处理”,由随后的检查点或保存点重命名并提交。

以下是缺少正在处理的零件文件的根本原因和缓解措施:

  • 用于启动适用于 Apache Flink 的托管服务应用程序的陈旧快照 — 只有在应用程序停止或更新时拍摄的最新系统快照才能用于通过 Amazon S3 启动适用于 Amazon Flink 的托管服务应用程序。 StreamingFileSink为避免此类故障,请使用最新的系统快照。

    • 例如,当您在停止或更新期间选择使用创建的快照CreateSnapshot而不是系统触发的快照时,就会发生这种情况。旧快照的保存点保留了对正在进行的部分文件的 out-of-date 引用,该文件已被后续检查点或保存点重命名并提交。

    • 当系统从非最新的 “停止/更新” 事件中触发的快照被选中时,也会发生这种情况。例如,已禁用系统快照但已RESTORE_FROM_LATEST_SNAPSHOT配置的应用程序。通常,使用 Amazon S3 的 Apache Flink 应用程序的托管服务 StreamingFileSink 应始终启用和RESTORE_FROM_LATEST_SNAPSHOT配置系统快照。

  • 已移除正在处理的部分文件 — 由于正在处理的部分文件位于 S3 存储桶中,因此其他有权访问该存储桶的组件或参与者可以将其删除。

    • 当您停止应用程序的时间过长,并且您的应用程序的 savepoint 引用的正在处理的部分文件已被 S3 存储桶 MultiPartUpload生命周期策略删除时,就会发生这种情况。为避免此类故障,请确保您的 S3 存储桶MPU生命周期策略涵盖的期限足够长,足以满足您的用例。

    • 当正在处理的零件文件被手动删除或被系统的另一个组件删除时,也可能发生这种情况。为避免此类故障,请确保正在处理的零件文件不会被其他参与者或组件删除。

  • 在 savepoint 之后触发自动检查点的争用条件 — 这会影响 Managed Service for Apache Flink 1.13 及以下版本。此问题已在 Apache Flink 版本 1.15 的托管服务中得到修复。将您的应用程序迁移到最新版本的 Apache Flink 托管服务,以防止再次发生。我们还建议从迁移 StreamingFileSink 到FileSink

    • 当应用程序停止或更新时,适用于 Managed Service for Apache Flink 会触发保存点并分两步停止应用程序。如果在这两个步骤之间触发了自动检查点,则该保存点将无法使用,因为其正在处理的部分文件将被重命名并可能被提交。