我的目标是创建一种机制,当一个新文件上传到云存储时,它将触发一个云函数。最终,此Cloud函数将触发Cloud数据流作业。
我有一个限制,云数据流作业应该用Go编写,云函数应该用Python编写。
我现在面临的问题是,我不能从云函数调用云数据流作业。
Go中编写的云数据流的问题是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
但上述机制无法创建新的数据流作业,而且看起来很麻烦。
有更好的方法来实现我的目标吗?我在上述机制上做错了什么?
云函数应该用Python 编写
云数据流客户端SDK只能从模板创建数据流作业。因此,除非您创建自己的模板,否则无法实现此要求。
我有一个限制,云数据流作业应该写入转到
由于您的Python目标无法实现,您的另一个选择是在Cloud Functions中运行Go程序。围棋的云函数在alpha
中。然而,我不知道在云函数中执行ApacheBeam(Dataflow)程序的方法。请记住,除非选择runner=DirectRunner
,否则ApacheBeam程序将在本地开始执行,并将自身连接到运行在其他地方的集群(Dataflow、Spark等)。
您选择了最不成熟的语言来使用ApacheBeam。成熟度和功能的顺序是Java(优秀)、Python(优秀且每天都在进步)、Go(还没有为黄金时段做好准备)。
如果你想运行用Go on Cloud Dataflow编写的Apache Beam程序,那么你需要使用一个平台,比如你的本地系统、谷歌计算引擎或谷歌应用引擎Flex。我不知道AppEngineStandard是否能在Go中运行ApacheBeam。
我发现Apache Beam Go SDK支持worker_binary
参数,该参数类似于Java数据流作业的template-location
。使用这个选项,我可以从我的python云函数中启动一个go数据流作业。