在CI管道中部署数据流

时间:2018-11-02 05:31:53

标签: python google-cloud-dataflow

我已经使用Beam SDK用python编写了一个流式Google Dataflow管道。有关如何在本地运行此文件并设置[[ 0 1 2 3 4 5 6 7] [ 8 9 10 11 12 13 14 15] [16 17 18 19 20 21 22 23] [24 25 26 27 28 29 30 31] [32 33 34 35 36 37 38 39] [40 41 42 43 44 45 46 47] [48 49 50 51 52 53 54 55] [56 57 58 59 60 61 62 63]] [ 9 10 11 12 13 14 17 22 25 30 33 38 41 46 49 50 51 52 53 54] 标志以使其在Dataflow上运行的文档。

我现在正在尝试将其自动部署到CI管道(bitbucket管道,但实际上并不相关)。有关于如何“运行”管道的文档,但没有真正“部署”它的文档。我测试过的命令如下:

-runner

这将运行该作业,但是由于它正在流式传输,因此它将永远不会返回。它还在内部管理包装并推入桶中。我知道我是否杀死了该进程,但它仍在运行,但是很难以某种方式在CI服务器上进行设置,以便能够检测到该进程实际上是成功的还是在超时后才杀死了它。

这似乎很荒谬,好像我缺少明显的东西,但是如何以一种可靠地从CI管道中部署它的方式在数据流上打包和运行此模块呢?

2 个答案:

答案 0 :(得分:1)

是的,这有点愚蠢。

基本上在使用

with beam.Pipeline(options=options) as p: 

语法,在幕后它称为wait_until_finish。因此,在我没有意识到的情况下调用了等待,导致它永远徘徊。重构以删除上下文管理器可以解决此问题。

答案 1 :(得分:0)

要在jamielennox's answer上展开。

在本地开发环境中使用直接运行器时,您希望看到管道无限期地运行;也许只是过一会后才能使用Ctrl-C手动取消。

部署管道以在GCP的数据流上运行时,您希望脚本部署作业并结束。

runner_name = pipeline_options.get_all_options().get('runner')

if runner_name == 'DirectRunner':
    with beam.Pipeline(options=pipeline_options) as pipeline:
        _my_setup_pipeline(config, pipeline, subscription_full_name)

elif runner_name == 'DataflowRunner':
    pipeline = beam.Pipeline(options=pipeline_options)
    _my_setup_pipeline(config, pipeline, subscription_full_name)
    pipeline.run()

else:
    raise Exception(f'Unknown runner: {runner_name}')