在谷歌数据流上完成另一个管道之后执行管道

时间:2018-03-09 10:21:57

标签: python google-cloud-dataflow apache-beam

我想在谷歌数据流上运行一个管道,这取决于另一个管道的输出。现在我只是在本地使用DirectRunner运行两个管道:

with beam.Pipeline(options=pipeline_options) as p:
    (p
     | beam.io.ReadFromText(known_args.input)
     | SomeTransform()
     | beam.io.WriteToText('temp'))

with beam.Pipeline(options=pipeline_options) as p:
    (p
     | beam.io.ReadFromText('temp*')
     | AnotherTransform()
     | beam.io.WriteToText(known_args.output))

我的问题如下:

  • DataflowRunner是否保证第二个仅在第一个管道完成后启动?
  • 是否有一种首选方法可以相继运行两条管道?
  • 还有推荐的方法将这些管道分成不同的文件以便更好地测试它们吗?

1 个答案:

答案 0 :(得分:2)

  

DataflowRunner是否保证第二个只在第一个管道完成后启动?

不,Dataflow只是执行一个管道。它没有用于管理依赖管道执行的功能。

更新:为了澄清,Apache Beam确实提供了一种等待管道完成执行的机制。请参阅waitUntilFinish()类的PipelineResult方法。参考:PipelineResult.waitUntilFinish()

  

是否有一种首选方法可以相继运行两条管道?

考虑使用Apache Airflow之类的工具来管理相关管道。您甚至可以实现一个简单的bash脚本,以便在另一个管道完成后部署一个管道。

  

还有推荐的方法将这些管道分成不同的文件,以便更好地测试它们吗?

是的,单独的文件。这只是一个很好的代码组织,不一定更适合测试。