使用BlockingDataflowPipelineRunner和Dataflow模板的后处理代码

时间:2017-06-05 18:08:21

标签: google-cloud-dataflow

我想在管道完成所有处理后运行一些代码,因此我使用BlockingDataflowPipelineRunner并在pipeline.run() main之后放置代码。

当我使用BlockingDataflowPipelineRunner从命令行运行作业时,这可以正常工作。管道完成处理后,pipeline.run()下的代码运行。

但是,当我尝试将作业作为模板运行时,它不起作用。我将作业部署为模板(使用TemplatingDataflowPipelineRunner),然后尝试在云函数中运行模板,如下所示:

dataflow.projects.templates.create({
    projectId: 'PROJECT ID HERE',
    resource: {
        parameters: {
            runner: 'BlockingDataflowPipelineRunner'
        },
        jobName: `JOB NAME HERE`,
        gcsPath: 'GCS TEMPLATE PATH HERE'
    }
}, function(err, response) {
    if (err) {
        // etc
    }
    callback();
});

跑步者似乎没有。我可以在跑步者身上乱搞,工作仍在继续。

我在pipeline.run()下的代码在每个作业运行时都不会运行 - 它只在我部署模板时运行。

预计每次作业运行时pipeline.run() main下的代码都不会运行吗?在管道完成后是否有执行代码的解决方案?

(对于上下文,pipeline.run()之后的代码将文件从一个云存储桶移动到另一个云存储桶。它正在归档刚刚由作业处理的文件。)

1 个答案:

答案 0 :(得分:2)

是的,这是预期的行为。模板表示管道本身,并通过启动模板允许(重新)执行管道。由于模板不包含main()方法中的任何代码,因此在管道执行后它不允许执行任何操作。

同样,dataflow.projects.templates.create API只是启动模板的API。

阻塞运行器完成此操作的方式是从创建的管道中获取作业ID,并定期轮询以观察何时完成。对于您的用例,您需要执行相同的操作:

  1. 执行dataflow.projects.templates.create(...)以创建数据流作业。这应该返回作业ID。
  2. 定期(例如每5-10秒)轮询dataflow.projects.jobs.get(...)以检索具有给定ID的作业,并检查它所处的状态。