我已经使用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管道中部署它的方式在数据流上打包和运行此模块呢?
答案 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}')