我的目标是创建一种机制,当新文件上传到Cloud Storage中时,它将触发Cloud Function。最终,此Cloud功能将触发Cloud Dataflow作业。
我有一个限制,即Cloud Dataflow作业应使用Go编写,而Cloud Function应使用Python编写。
我现在面临的问题是,我无法从Cloud Function调用Cloud Dataflow作业。
Go编写的Cloud Dataflow中的问题是Apache Beam Go SDK中没有定义template-location
变量。这就是为什么我无法创建数据流模板的原因。而且,由于没有数据流模板,所以我可以从云函数调用Cloud Dataflow作业的唯一方法是编写Python作业,该作业调用运行数据流作业的bash脚本。
bash脚本如下所示:
go run wordcount.go \
--runner dataflow \
--input gs://dataflow-samples/shakespeare/kinglear.txt \
--output gs://${BUCKET?}/counts \
--project ${PROJECT?} \
--temp_location gs://${BUCKET?}/tmp/ \
--staging_location gs://${BUCKET?}/binaries/ \
--worker_harness_container_image=apache-docker-beam-snapshots-docker.bintray.io/beam/go:20180515
但是上述机制无法创建新的数据流作业,而且看起来很麻烦。
有没有更好的方法可以实现我的目标?在上述机制上我做错了什么?
答案 0 :(得分:3)
Cloud Function应该用Python编写
Cloud Dataflow Client SDK只能从模板创建Dataflow作业。因此,除非您创建自己的模板,否则无法实现此要求。
我有一个限制,即应将Cloud Dataflow作业写入 去
由于无法实现Python目标,因此您的另一个选择是在Cloud Functions中运行Go程序。 Go的Cloud Functions位于alpha
中。但是,我不知道在Cloud Functions中执行Apache Beam(Dataflow)程序的方法。请记住,除非选择runner=DirectRunner
,否则Apache Beam程序将开始在本地执行并将其自身连接到在其他地方运行的集群(数据流,Spark等)。
您选择了最不成熟的语言来使用Apache Beam。成熟度和功能的顺序是Java(优秀),Python(每天都在变得越来越好),Go(尚未准备好黄金时段)。
如果您要运行用Go on Cloud Dataflow编写的Apache Beam程序,则需要使用一个平台,例如本地系统,Google Compute Engine或Google App Engine Flex。我不知道App Engine Standard是否可以在Go中运行Apache Beam。
答案 1 :(得分:1)
我发现Apache Beam Go SDK支持worker_binary
参数,该参数类似于Java Dataflow作业的template-location
。使用此选项,我能够从python云功能开始执行go数据流作业。