Java 如何使用云存储的pubsub通知触发数据流管道

Java 如何使用云存储的pubsub通知触发数据流管道,java,google-cloud-dataflow,apache-beam,Java,Google Cloud Dataflow,Apache Beam,我正在尝试将Google云数据流管道与集成。 这个想法是在文件创建后立即开始处理它。 消息正在发布,我使用publisubio.readMessagesWithAttributes()source设法提取文件URI: Pipeline p=Pipeline.create(选项); PCollection uris=p.apply(publisubio.readMessagesWithAttributes() .WithTimestamp属性(PUBSUB\u TIMESTAMP\u LABEL\

我正在尝试将Google云数据流管道与集成。 这个想法是在文件创建后立即开始处理它。 消息正在发布,我使用
publisubio.readMessagesWithAttributes()
source设法提取文件URI:

Pipeline p=Pipeline.create(选项);
PCollection uris=p.apply(publisubio.readMessagesWithAttributes()
.WithTimestamp属性(PUBSUB\u TIMESTAMP\u LABEL\u键)
.fromSubscription(options.GetPubSubscription()))
.apply(映射元素)
.into(typedescriptor.strings())
.via((PubsubMessage msg)->{
字符串bucket=msg.getAttribute(“bucketId”);
String object=msg.getAttribute(“objectId”);
GcsPath uri=GcsPath.fromComponents(bucket,object);
返回uri.toString();
}));

uris PCollection
中,哪个
PTransform
可以用来开始读取/处理每个文件?

结合云存储更改通知应该是一个不错的选择(尽管仍处于测试阶段)

使用云函数,您可以使用一些Javascript代码启动数据流作业。这是一个很好的方法,应该会让你走上正轨。每当一个新文件到达bucket或一个文件发生更改并处理这些文件时,数据流作业就会启动


如果您希望坚持您的方法,您可能希望使用以自定义方式读取文件。不过,不确定这种方法是否更可取。

ApacheBeamAtHead包含一个p转换,它完全可以执行您想要的操作:读取文件模式或文件名的
p集合。它将在Beam 2.2.0中提供,但现在您只需从github repo中自己构建Beam的快照,并依赖于此。

我们每分钟都会有文件到达,如何将一个无限源(PubSub)传输到一个有界源(文本)。不能使用基于
TextIO
FileBasedSource
的解决方案进行每行处理?@FábioUechi我可以想到两种架构:1)使用上述云函数通知新文件到达,然后通过每行将文件发布到发布/子主题来处理文件。流式数据流作业订阅此PubSub主题并执行其余处理。2) 如上所述,您的数据流作业从带有URL的PubSub主题中读取,并且您使用自定义DoFn中的云存储SDK来读取和处理文件。可能还有其他选择,我非常乐意听到。我最终实现了2)。但我认为@jkff TextIO.realAll()建议会更好,因为它似乎可以处理大文件拆分。@FábioUechi有道理!我只是还没有意识到新的pttransform.readAll()似乎起到了作用。您知道快照是否在任何公共maven repo中生成/发布吗?您可以尝试在POM中包含
org.apache.beam-beam-sdks java io google cloud platform 2.2.0-SNAPSHOT