StreamingFileSink + GCS

时间:2019-12-03 02:16:21

标签: google-cloud-storage apache-flink

我当前正在使用Flink 1.7 + gcs-connector lib。我正在尝试将StreamingFileSink写入GCS存储桶,并遇到以下异常:

我遇到了这个Jira:https://issues.apache.org/jira/browse/FLINK-11838-但是我不清楚代码是否曾经合并过。

要使此功能正常工作,对任何需要做的帮助都非常感谢?

java.lang.UnsupportedOperationException: Recoverable writers on Hadoop are only supported for HDFS and for Hadoop version 2.7 or newer
    at org.apache.flink.runtime.fs.hdfs.HadoopRecoverableWriter.<init>(HadoopRecoverableWriter.java:57) ~[flink-hadoop-fs-1.7.0.jar:1.7.0]
    at org.apache.flink.runtime.fs.hdfs.HadoopFileSystem.createRecoverableWriter(HadoopFileSystem.java:202) ~[flink-hadoop-fs-1.7.0.jar:1.7.0]
    at org.apache.flink.core.fs.SafetyNetWrapperFileSystem.createRecoverableWriter(SafetyNetWrapperFileSystem.java:69) ~[flink-core-1.7.0.jar:1.7.0]
    at org.apache.flink.streaming.api.functions.sink.filesystem.Buckets.<init>(Buckets.java:112) ~[flink-streaming-java_2.11-1.7.0.jar:1.7.0]
    at org.apache.flink.streaming.api.functions.sink.filesystem.StreamingFileSink$BulkFormatBuilder.createBuckets(StreamingFileSink.java:317) ~[flink-streaming-java_2.11-1.7.0.jar:1.7.0]
    at org.apache.flink.streaming.api.functions.sink.filesystem.StreamingFileSink.initializeState(StreamingFileSink.java:327) ~[flink-streaming-java_2.11-1.7.0.jar:1.7.0]
    at org.apache.flink.streaming.util.functions.StreamingFunctionUtils.tryRestoreFunction(StreamingFunctionUtils.java:178) ~[flink-streaming-java_2.11-1.7.0.jar:1.7.0]
    at org.apache.flink.streaming.util.functions.StreamingFunctionUtils.restoreFunctionState(StreamingFunctionUtils.java:160) ~[flink-streaming-java_2.11-1.7.0.jar:1.7.0]
    at org.apache.flink.streaming.api.operators.AbstractUdfStreamOperator.initializeState(AbstractUdfStreamOperator.java:96) ~[flink-streaming-java_2.11-1.7.0.jar:1.7.0]
    at org.apache.flink.streaming.api.operators.AbstractStreamOperator.initializeState(AbstractStreamOperator.java:278) ~[flink-streaming-java_2.11-1.7.0.jar:1.7.0]
    at org.apache.flink.streaming.runtime.tasks.StreamTask.initializeState(StreamTask.java:738) ~[flink-streaming-java_2.11-1.7.0.jar:1.7.0]
    at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:289) ~[flink-streaming-java_2.11-1.7.0.jar:1.7.0]
    at org.apache.flink.runtime.taskmanager.Task.run(Task.java:704) ~[flink-runtime_2.11-1.7.0.jar:1.7.0]
    at java.lang.Thread.run(Thread.java:834) ~[?:?]


1 个答案:

答案 0 :(得分:1)

据我所知,它没有合并。

问题是,要使Flink接收器组件参与检查点保存和恢复,它必须能够重置该接收器组件正在写入的内容的状态。对于接收器写入文件的情况,这意味着接收器可能必须截断文件并开始附加到文件,以使文件返回到上一个检查点时文件所处的状态。像Amazon的S3一样,GCS是二进制对象存储,而不是真实的文件系统。尽管可以使用二进制存储执行大多数操作,而可以使用文件系统执行大多数操作,但是您不能截断二进制对象,也不能附加到二进制对象。可能会显示您正在截断并附加到二进制对象,但这是一个非常低效的API层。因此,尝试在GCS(或S3)上使用StreamingFileSink并不是很有效。

您最好将其写入实际的文件系统,然后再添加最后一步将写入的文件传输到GCS。这意味着您可能不得不编写另一个接收器,以便行为可以被检查点体系结构覆盖,但这是您的最佳选择。我想。