Google cloud platform 它是否能够使用dataflow?将数据从pubsub流到数据存储;

Google cloud platform 它是否能够使用dataflow?将数据从pubsub流到数据存储;,google-cloud-platform,google-cloud-datastore,google-cloud-dataflow,google-cloud-pubsub,Google Cloud Platform,Google Cloud Datastore,Google Cloud Dataflow,Google Cloud Pubsub,我尝试使用数据流将数据从pubsub流到数据存储 参考: 我尝试构建模板,但它根本不起作用。 因此,我认为这是不可能的 怎么样? 请给我一些建议。您可能在该特定模板中偶然发现了一个bug。其中有两个独立的问题,第一个是本SO问题中回答的问题,它指向缺少的errorTag,第二个是数据存储的写入程序在将实体写入数据存储时实际使用了GroupByKey 如果使用-e选项运行maven compile命令,则会显示错误消息GroupByKey无法在没有触发器的情况下应用于GlobalWindow中的

我尝试使用数据流将数据从pubsub流到数据存储

参考:

我尝试构建模板,但它根本不起作用。 因此,我认为这是不可能的

怎么样?
请给我一些建议。

您可能在该特定模板中偶然发现了一个bug。其中有两个独立的问题,第一个是本SO问题中回答的问题,它指向缺少的
errorTag
,第二个是数据存储的写入程序在将实体写入数据存储时实际使用了
GroupByKey

如果使用
-e
选项运行maven compile命令,则会显示错误消息
GroupByKey无法在没有触发器的情况下应用于GlobalWindow中的非绑定PCollection。在GroupByKey之前使用Window.into或Window.triggering转换
。为什么会这样?这与以下事实有关:消息是从PubSub流式传输的,而不是批处理的(这是我们所期望的)。这意味着,并没有有限的一组项目正在流入,而是一个永无止境的项目流。为了解决这个问题,我们需要将其限制为聚合函数(如
GroupByKey
)可以考虑的项目流窗口。帮助将实体写入数据存储的
DatastoreConverters
类实际上检查我们是否尝试多次写入同一个键,它通过使用
GroupByKey
函数来实现这一点

简单的解决方案,只需给它一个流窗口即可,这里添加了第三个
。在管道中应用(…)
,将流窗口化,并允许您在此处使用数据存储编写器:

import org.apache.beam.sdk.transforms.windowing.FixedWindows;
导入org.apache.beam.sdk.transforms.windowing.Window;
导入org.apache.beam.sdk.values.TupleTag;
导入org.joda.time.Duration;
... 
公共静态void main(字符串[]args){
PubsubToDatastoreOptions=PipelineOptionsFactory.fromArgs(args)
.withValidation()
.as(数据存储选项.class);
Pipeline=Pipeline.create(选项);
TupleTag errorTag=新的TupleTag(“错误”){};
管道
.apply(publisubio.readStrings()
.fromTopic(options.getPubsubReadTopic()))
.apply(TransformTextViaJavascript.newBuilder()
.setfilesystemspath(options.getJavascriptTextTransformGcsPath())
.setFunctionName(options.getJavascriptTextTransformFunctionName())
.build())
.apply(Window.into(FixedWindows.of(Duration.standardSeconds(1)))
.apply(WriteJsonEntities.newBuilder()
.setProjectId(options.getDatastoreWriteProjectId())
.setErrorTag(errorTag)
.build());
pipeline.run();
}
现在还有其他方法,而且可能更好,但这将使您的模板编译和工作。这个例子显示了一个1秒的固定窗口,有其他选项可以执行此操作,请查看文档

使用以下工具编译模板:

mvn compile exec:java -Dexec.mainClass=com.google.cloud.teleport.templates.PubsubToDatastore -Dexec.cleanupDaemonThreads=false -Dexec.args=" \
--project=[YOUR_PROJECTID_HERE] \
--stagingLocation=gs://[YOUR_BUCKET_HERE]/staging \
--tempLocation=gs://[YOUR_BUCKET_HERE]/temp \
--templateLocation=gs://[YOUR_BUCKET_HERE]/templates/PubsubToDatastore.json \
--runner=DataflowRunner"
然后使用以下命令启动作业:

gcloud dataflow jobs run [NAME_OF_THE_JOB_WHATEVER_YOU_LIKE] \
--gcs-location=gs://[YOUR_BUCKET_HERE]/templates/PubsubToDatastore.json \
--zone=[ZONE_WHERE_YOU_WANT_TO_RUN] \
--parameters "pubsubReadTopic=[YOUR_PUBSUB_TOPIC_HERE],datastoreWriteProjectId=[YOUR_PROJECTID_HERE]"
现在,如果您在GCP控制台中查看,您应该会看到您的作业正在运行:


请注意,此特定解决方案和所选窗口将意味着PubSub消息在数据存储中结束的延迟高达1秒。缩短窗口可能会有所帮助,但为了获得更高的吞吐量,您需要一条不同于此处所示的管道。

谢谢您的回答。我非常感谢你的建议。我尝试了你的解决方案并取得了成功。非常感谢你!!我还发现这很有用。我在Github中为您提到的GroupByKey异常打开了一个。