S3 StreamingFileSink FileNotFoundExceptions - Managed Service for Apache Flink

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

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

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

  • 用于启动适用于 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 会触发保存点并分两步停止应用程序。如果在这两个步骤之间触发了自动检查点,则该保存点将无法使用,因为其正在处理的部分文件将被重命名并可能被提交。