【问题标题】:Flink streaming file sink cannot recover from failureFlink流文件接收器无法从故障中恢复
【发布时间】:2019-11-27 03:52:42
【问题描述】:

我们有一个 flink 流作业,它从 kafka 读取数据并将其接收到 S3。我们使用 flink 的内部流文件接收器 API 来实现这一点。但是,几天后,作业失败并且无法从失败中恢复。该消息说它无法从 s3 中找到 tmp 文件。我们想知道可能的根本原因是什么,因为我们真的不想丢失任何数据。

谢谢。

整个输出是这样的

java.io.FileNotFoundException: No such file or directory: s3://bucket_name/_part-0-282_tmp_b9777494-d73b-4141-a4cf-b8912019160e
    at org.apache.flink.fs.shaded.hadoop3.org.apache.hadoop.fs.s3a.S3AFileSystem.s3GetFileStatus(S3AFileSystem.java:2255)
    at org.apache.flink.fs.shaded.hadoop3.org.apache.hadoop.fs.s3a.S3AFileSystem.innerGetFileStatus(S3AFileSystem.java:2149)
    at org.apache.flink.fs.shaded.hadoop3.org.apache.hadoop.fs.s3a.S3AFileSystem.getFileStatus(S3AFileSystem.java:2088)
    at org.apache.flink.fs.shaded.hadoop3.org.apache.hadoop.fs.s3a.S3AFileSystem.open(S3AFileSystem.java:699)
    at org.apache.flink.fs.shaded.hadoop3.org.apache.hadoop.fs.FileSystem.open(FileSystem.java:950)
    at org.apache.flink.fs.s3hadoop.HadoopS3AccessHelper.getObject(HadoopS3AccessHelper.java:99)
    at org.apache.flink.fs.s3.common.writer.S3RecoverableMultipartUploadFactory.recoverInProgressPart(S3RecoverableMultipartUploadFactory.java:97)
    at org.apache.flink.fs.s3.common.writer.S3RecoverableMultipartUploadFactory.recoverRecoverableUpload(S3RecoverableMultipartUploadFactory.java:75)
    at org.apache.flink.fs.s3.common.writer.S3RecoverableWriter.recover(S3RecoverableWriter.java:95)
    at org.apache.flink.fs.s3.common.writer.S3RecoverableWriter.recover(S3RecoverableWriter.java:50)
    at org.apache.flink.streaming.api.functions.sink.filesystem.Bucket.restoreInProgressFile(Bucket.java:140)
    at org.apache.flink.streaming.api.functions.sink.filesystem.Bucket.<init>(Bucket.java:127)
    at org.apache.flink.streaming.api.functions.sink.filesystem.Bucket.restore(Bucket.java:396)
    at org.apache.flink.streaming.api.functions.sink.filesystem.DefaultBucketFactoryImpl.restoreBucket(DefaultBucketFactoryImpl.java:64)
    at org.apache.flink.streaming.api.functions.sink.filesystem.Buckets.handleRestoredBucketState(Buckets.java:177)
    at org.apache.flink.streaming.api.functions.sink.filesystem.Buckets.initializeActiveBuckets(Buckets.java:165)
    at org.apache.flink.streaming.api.functions.sink.filesystem.Buckets.initializeState(Buckets.java:149)
    at org.apache.flink.streaming.api.functions.sink.filesystem.StreamingFileSink.initializeState(StreamingFileSink.java:334)
    at org.apache.flink.streaming.util.functions.StreamingFunctionUtils.tryRestoreFunction(StreamingFunctionUtils.java:178)
    at org.apache.flink.streaming.util.functions.StreamingFunctionUtils.restoreFunctionState(StreamingFunctionUtils.java:160)
    at org.apache.flink.streaming.api.operators.AbstractUdfStreamOperator.initializeState(AbstractUdfStreamOperator.java:96)
    at org.apache.flink.streaming.api.operators.AbstractStreamOperator.initializeState(AbstractStreamOperator.java:278)
    at org.apache.flink.streaming.runtime.tasks.StreamTask.initializeState(StreamTask.java:738)
    at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:289)
    at org.apache.flink.runtime.taskmanager.Task.run(Task.java:704)
    at java.lang.Thread.run(Thread.java:748)

【问题讨论】:

  • 您好@胡广,能否请您粘贴整个错误消息和您用于定义接收器的代码 sn-p?
  • @TobiSH 我已经粘贴了上面的整个消息。谢谢
  • 您好,我在 Kinesis Analytics 和 S3 上使用 Flink 时遇到了同样的问题。有任何更新或解决方案吗?就我而言,快照/重新部署后我无法恢复

标签: amazon-s3 apache-flink


【解决方案1】:

感谢您报告此问题!

您能指定您使用的是哪个 Flink 版本吗?我问的原因是因为您的问题可能与这张https://issues.apache.org/jira/browse/FLINK-13940 票有关。

此外,StreamingFileSink 使用了 S3 的Multi-Part Upload 功能。这意味着文件会逐渐分小部分上传到 S3,当需要“提交”它们时,所有部分在概念上都会连接到一个对象中。 S3 允许您为您的 bucker 指定未决(即未提交)多部分上传 (MPU) 的超时时间,当此超时时,未决 MPU 将中止并删除数据。所以如果你过于激进地设置这个参数,那么你可能会碰到这个问题。

最后,从您之前的帖子中,我猜您正在尝试从失败而不是从保存点重新启动。它是否正确?如果您尝试从旧的保存点重新启动,那么您可能会遇到接收器已经提交该 MPU 并且现在接收器找不到它的问题。

我希望这会有所帮助。

【讨论】:

  • 我们使用的是 flink-1.7.1。我很确定 S3 的超时设置不是问题,因为我们将其设置为 7 天。我会更新flink版本来验证是不是和FLINK-13940一样的问题。
  • 嗨,科斯塔斯。我们尝试使用 1.8.2 版本升级我们的 flink 作业 jar,而不升级我们的集群版本。但错误有时仍然存在。你能告诉我们如何解决这个问题吗?谢谢
  • 抱歉回复晚了。您是否检查过您的存储桶中是否存在“part-0-282”文件?这意味着该文件已经提交。
猜你喜欢
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 2020-03-20
  • 1970-01-01
相关资源
最近更新 更多