如何从 GCP 中的 Cloud Functions 调用用 Go 编写的 Dataflow 作业
How to call a Dataflow job written in Go from Cloud Functions in GCP
我的目标是创建一种机制,当新文件上传到云存储时,它会触发云函数。最终,此 Cloud 函数将触发 Cloud Dataflow 作业。
我有一个限制,Cloud Dataflow 作业应该用 Go 编写,Cloud Function 应该用 Python 编写。
我现在面临的问题是,我无法从 Cloud Function 调用 Cloud Dataflow 作业。
用 Go 编写的 Cloud Dataflow 中的问题是 Apache Beam Go SDK 中没有定义 template-location
变量。这就是我无法创建数据流模板的原因。而且,由于没有数据流模板,我可以从云函数调用云数据流作业的唯一方法是编写一个 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
但上述机制无法创建新的数据流作业,看起来很麻烦。
有没有更好的方法来实现我的目标?我在上述机制上做错了什么?
the Cloud Function should be written in Python
Cloud Dataflow 客户端 SDK 只能从模板创建数据流作业。因此,除非您创建自己的模板,否则无法实现此要求。
I have a restriction that the Cloud Dataflow job should be written in
Go
既然你的Pythonobjective无法实现,你的另一个选择是运行你的Go程序在Cloud Functions中。 Cloud Functions for Go 在 alpha
中。但是,我不知道有什么方法可以在 Cloud Functions 中执行 Apache Beam (Dataflow) 程序。请记住,除非您 select 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。
我发现 Apache Beam Go SDK 支持 worker_binary
参数,该参数类似于 Java 数据流作业的 template-location
。使用此选项,我能够从我的 python 云函数启动一个 go dataflow 作业。
我的目标是创建一种机制,当新文件上传到云存储时,它会触发云函数。最终,此 Cloud 函数将触发 Cloud Dataflow 作业。
我有一个限制,Cloud Dataflow 作业应该用 Go 编写,Cloud Function 应该用 Python 编写。
我现在面临的问题是,我无法从 Cloud Function 调用 Cloud Dataflow 作业。
用 Go 编写的 Cloud Dataflow 中的问题是 Apache Beam Go SDK 中没有定义 template-location
变量。这就是我无法创建数据流模板的原因。而且,由于没有数据流模板,我可以从云函数调用云数据流作业的唯一方法是编写一个 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
但上述机制无法创建新的数据流作业,看起来很麻烦。
有没有更好的方法来实现我的目标?我在上述机制上做错了什么?
the Cloud Function should be written in Python
Cloud Dataflow 客户端 SDK 只能从模板创建数据流作业。因此,除非您创建自己的模板,否则无法实现此要求。
I have a restriction that the Cloud Dataflow job should be written in Go
既然你的Pythonobjective无法实现,你的另一个选择是运行你的Go程序在Cloud Functions中。 Cloud Functions for Go 在 alpha
中。但是,我不知道有什么方法可以在 Cloud Functions 中执行 Apache Beam (Dataflow) 程序。请记住,除非您 select 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。
我发现 Apache Beam Go SDK 支持 worker_binary
参数,该参数类似于 Java 数据流作业的 template-location
。使用此选项,我能够从我的 python 云函数启动一个 go dataflow 作业。