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