如何从 GCP 中的 Cloud Functions 调用用 Go 编写的 Dataflow 作业

我的目标是创建一种机制,当新文件上传到云存储时,它会触发云函数。最终,此 Cloud 函数将触发 Cloud Dataflow 作业。


我有一个限制,即 Cloud Dataflow 作业应该用 Go 编写,而 Cloud Function 应该用 Python 编写。


我现在面临的问题是,我无法从 Cloud Function 调用 Cloud Dataflow 作业。


用 Go 编写的 Cloud Dataflow 中的问题是template-locationApache Beam Go SDK 中没有定义变量。这就是我无法创建数据流模板的原因。而且,由于没有数据流模板,我可以从云函数调用云数据流作业的唯一方法是编写一个 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

但上述机制无法创建新的数据流作业,而且看起来很麻烦。


有没有更好的方法来实现我的目标?我在上述机制上做错了什么?


倚天杖
浏览 159回答 2
2回答

慕标5832272

Cloud Function 应该用 Python 编写Cloud Dataflow Client SDK 只能从模板创建数据流作业。因此,除非您创建自己的模板,否则无法实现此要求。我有一个限制,即 Cloud Dataflow 作业应该用 Go 编写由于您的 Python 目标无法实现,您的另一个选择是在 Cloud Functions 中运行您的 Go 程序。Go 的 Cloud Functions 在alpha. 但是,我不知道有什么方法可以在 Cloud Functions 中执行 Apache Beam (Dataflow) 程序。请记住,Apache Beam 程序开始在本地执行并将其自身连接到在其他地方(Dataflow、Spark 等)运行的集群,除非您选择runner=DirectRunner.您选择了最不成熟的语言来使用 Apache Beam。成熟度和功能的顺序是 Java(优秀)、Python(很好并且每天都在进步)、Go(还没有准备好迎接黄金时段)。如果您想在 Cloud Dataflow 上运行用 Go 编写的 Apache Beam 程序,那么您将需要使用一个平台,例如您的本地系统、Google Compute Engine 或 Google App Engine Flex。我不知道 App Engine Standard 是否可以在 Go 中运行 Apache Beam。

MMTTMM

我发现 Apache Beam Go SDK 支持worker_binary类似于template-locationJava 数据流作业的参数。使用此选项,我能够从我的 python 云函数启动一个 go 数据流作业。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go